我想删除一行。我的表是'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;
}
2条答案
按热度按时间0pizxfdo1#
这里有两个问题:
1.您的sql不包含任何参数关键字:
?
使用java设置参数ps.setInt(1, id)
,但您的sql不包含关键字?
参数使用示例?
:您可以从mysql-java.sql.sqlexception参数索引超出范围(1>参数数,即0)-堆栈溢出了解更多详细信息
2.你的sql可能错了
“goal”表不包含“goal”列。
应该改成:
sql fiddle演示链接
mccptt672#
在我看来,你的代码很糟糕。你在执行这个
String sql = "ALTER TABLE 'goal' ADD CONSTRAINT 'fk' FOREIGN KEY('goal') REFERENCES 'goal' ('id') ON DELETE CASCADE ";
每次调用此方法时。您应该在创建表时添加约束。为了从某个表中删除一行,我建议您创建一个数据库过程或函数,并通过java调用它。这只是一个例子,但我认为这是正确的方法。在这个过程中,您接受您的id作为参数并删除那里的行。