【问题标题】:#0001: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)#0001: java.sql.SQLException: 参数索引超出范围(1 > 参数数量,即 0)
【发布时间】:2018-06-16 07:44:17
【问题描述】:

我想删除一行。我的表格是“目标”和“贡献”。它显示上述错误。 请立即告诉您有什么问题。

表结构是,

 //goal TABLE
 CREATE TABLE `goal` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(555) NOT NULL,
`target_value` double NOT NULL,
 `target_date` date NOT NULL,
`created_date` datetime NOT NULL,
 `status` int(11) NOT NULL,
PRIMARY KEY (`id`))
 ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8
COLLATE=utf8mb4_0900_ai_ci   
 //Contribute TABLE 
CREATE TABLE `contribute` 
(`id` int(11) NOT NULL AUTO_INCREMENT,`goal` int(11) NOT NULL,
`amount` double NOT NULL, `date` date NOT NULL,
PRIMARY KEY (`id`),KEY `idgoal_idx` (`goal`),
 CONSTRAINT `fk` FOREIGN KEY (`goal`) REFERENCES `goal` (`id`))
 ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8m
COLLATE=utf8mb4_0900_ai_ci

//代码

public static boolean delete(int id) {

    try {
        Connection con = DB.getConnection();

        String sql = "ALTER TABLE 'goal' ADD CONSTRAINT 'fk' FOREIGN 
        KEY('goal') REFERENCES 'goal' ('id') ON DELETE CASCADE ";
        PreparedStatement ps = con.prepareStatement(sql);

        ps.setInt(1, id);

        ps.executeUpdate();
        return true;
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return false;

}

【问题讨论】:

  • 你的表结构是什么?
  • 添加了表结构。
  • @ManojChathuranga 我在下面回答。

标签: java mysql sql netbeans


【解决方案1】:

这里有两个问题:

1.你的sql不包含任何参数关键字:?

你使用java set参数ps.setInt(1, id),但是你的sql不包含关键字?

使用?的参数示例:

PreparedStatement p = con.prepareStatement("select * from xxxTable where xxx = ?");
p.setString(1, xxx);

更多详情可以向mysql - java.sql.SQLException Parameter index out of range (1 > number of parameters, which is 0) - Stack Overflow了解


2.你的SQL可能错了

ALTER TABLE 'goal' ADD CONSTRAINT 'fk' FOREIGN 
    KEY('goal') REFERENCES 'goal' ('id') ON DELETE CASCADE

“目标”表不包含“目标”列。

应该改成这样:

ALTER TABLE `contribute`
ADD FOREIGN KEY (`goal`) REFERENCES `goal`(`id`)  ON DELETE CASCADE ; 

SQL Fiddle Demo Link

【讨论】:

  • 你删除ps.setInt(1, id)吗?
【解决方案2】:

在我看来,您的代码很糟糕。你正在执行这个

String sql = "ALTER TABLE 'goal' ADD CONSTRAINT 'fk' FOREIGN KEY('goal') REFERENCES 'goal' ('id') ON DELETE CASCADE ";

每次调用此方法时。您应该在创建表时添加约束。 为了从某个表中删除一行,我建议您创建一个数据库过程或函数来执行它并通过 java 调用它。

String sql = "{? = call your_schema.your_package.delete_object(?)}";

try (CallableStatement cs = con.createCallableStatement(sql)) {
     cs.setInt(1, id);
     cs.executeQuery();
}

这只是一个例子,但我认为这是正确的做法。在此过程中,您接受您的 ID 作为参数并删除那里的行。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多