【问题标题】:Problem creating foreign keys in mySql在 mySql 中创建外键的问题
【发布时间】:2011-06-13 18:02:09
【问题描述】:

我通过以下语句在我的 sql 中创建了一个外键..

ALTER TABLE `users` ADD FOREIGN KEY ( `id`) 
REFERENCES `user_login` (`user_id`) 
ON DELETE CASCADE ;

创建似乎成功,然后我执行删除语句

DELETE From user_login WHERE user_id = 1576;

但在用户中,引用该行的行仍然存在。我打开 mysql 工作台,它没有显示任何外键已创建的迹象。有谁知道为什么会这样?或者我做错了什么?在两个表中是一对一的关系。

【问题讨论】:

  • ALTER TABLE 语句是否返回错误——表明它没有被应用? DDL 语句隐式提交,因此与事务无关。
  • @OMG Ponies 不,它不会返回错误,它只是说 1306 行受到影响

标签: sql mysql foreign-keys myisam cascading-deletes


【解决方案1】:

表可能是 MyISAM 格式,不支持外键。

尝试先将其转换为 InnoDB:

alter table users engine=InnoDB;

【讨论】:

  • 很好,我应该使用什么引擎?我对 MySQL 世界很了解,我过去一直使用 MS SQL
  • 为什么会默认使用不允许 FK 的引擎?
  • 我猜这是出于向前兼容性的原因
【解决方案2】:

您还必须确保users.iduser_login.user_id 都有一个索引。

【讨论】:

  • 他们都有。两者都是各自表中的主键。
  • 索引与参照完整性约束无关。
【解决方案3】:

将此代码复制并粘贴到您的 Mysql 脚本编辑器 中并运行。您将有两个表 categoriesproducts 这些表具有 cat_id 作为 外键

CREATE DATABASE IF NOT EXISTS dbdemo;

USE dbdemo;

CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;

CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 2014-11-19
    • 1970-01-01
    • 2019-07-01
    • 2015-01-18
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多