如何在mysql中删除包含所有相关外键和其他约束的列?
答案 0 :(得分:4)
使用SET FOREIGN_KEY_CHECKS = 0;
,然后更改包含约束定义的表。完成后,将FOREIGN_KEY_CHECKS
改回1.
答案 1 :(得分:2)
MySQL上的AFAIK 你必须在删除列之前手动删除约束。
仅当您使用该子句创建约束时,ON DELETE CASCADE子句才会影响表,并且只需要删除与该表关联的外部行。
答案 2 :(得分:1)
使用ON DELETE CASCADE
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
答案 3 :(得分:1)
如果你正在使用java:
public void deleteColumn(Connection connection, String tableName, String columnName) throws SQLException {
// Drop all constraints that contain the specified column
{
final ResultSet resultSet = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).executeQuery("select CONSTRAINT_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA = SCHEMA() and TABLE_NAME = '" + tableName + "' and COLUMN_NAME = '" + columnName + "'");
while (resultSet.next()) {
final String constraintName = resultSet.getString("CONSTRAINT_NAME");
connection.createStatement().executeUpdate("ALTER TABLE `" + tableName + "` DROP FOREIGN KEY`" + constraintName + "`"); // Drop the foreign key constraint
}
resultSet.close();
}
// Drop all indexes that contain the specified column:
{
final ResultSet resultSet = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).executeQuery("SHOW INDEX FROM `" + tableName + "` where column_name = '" + columnName+ "'");
while (resultSet.next()) {
final String keyName = resultSet.getString("Key_name");
connection.createStatement().executeUpdate("ALTER TABLE `" + tableName + "` DROP INDEX `" + keyName + "`"); // Drop the index
}
resultSet.close();
}
// Drop the column:
connection.createStatement().executeUpdate("ALTER TABLE `" + tableName + "` DROP COLUMN `" + columnName + "`"); // Drop the column
}