#0001:java.sql.sqlexception:参数索引超出范围(1>参数个数,为0)

u4dcyp6a  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(359)

我想删除一行。我的表是'goal'和'contribute'。它显示了上面的错误。请马上告诉我有什么问题。
表结构是,

//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;

}
0pizxfdo

0pizxfdo1#

这里有两个问题:
1.您的sql不包含任何参数关键字: ? 使用java设置参数 ps.setInt(1, id) ,但您的sql不包含关键字 ? 参数使用示例 ? :

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

您可以从mysql-java.sql.sqlexception参数索引超出范围(1>参数数,即0)-堆栈溢出了解更多详细信息
2.你的sql可能错了

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

“goal”表不包含“goal”列。
应该改成:

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

sql fiddle演示链接

mccptt67

mccptt672#

在我看来,你的代码很糟糕。你在执行这个 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作为参数并删除那里的行。

相关问题