【问题标题】:MySQL foreign key ON DELETE SET NULL check data types errorMySQL外键ON DELETE SET NULL检查数据类型错误
【发布时间】:2013-09-14 23:31:22
【问题描述】:

我正在开发一个标准化数据库,为了安全起见,我想使用外键。

我的数据库:

CREATE TABLE `names` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `name_2` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_id` (`name_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

命令:

ALTER TABLE  `names` ADD FOREIGN KEY (  `name` ) REFERENCES  `temp`.`users` (
`name_id`
) ON DELETE SET NULL ON UPDATE CASCADE ;

响应(错误):
在名称上创建外键时出错(检查数据类型)

那么,如何解决这个问题?

【问题讨论】:

  • 也许你也应该创建你的 AUTO_INCREMENT 列 unsigned 你没有负数,如果你不需要一个负值,还有 name_id 。

标签: mysql sql innodb


【解决方案1】:

错误是不言自明的。 names 表中的 Namevarchar(250) 类型,而 users 表中的 name_idint(11) 类型。

但我相信你的意思是在 users 表中一直有一个 FK 引用 names 表。

ALTER TABLE users
ADD FOREIGN KEY (name_id) REFERENCES names (id) 
  ON DELETE SET NULL ON UPDATE CASCADE; 

这里是SQLFiddle演示

【讨论】:

  • 哇,谢谢!我想这是一个愚蠢的错误,我认为 DELETE 和 UPDATE 是为父母改变而不是孩子改变的。 (父母 = 用户,孩子 = 姓名)。
【解决方案2】:

两个键的类型和长度必须相同,你有 varchar 和 int。

这是你想要的:

ALTER TABLE  `names` ADD FOREIGN KEY (  `id` ) REFERENCES  `users` (
`name_id`)

【讨论】:

  • 他们都将 INT(11) 设置为他们的类型?
  • 名称和name_id不同。
  • 没错,但我不是在names.idusers.name_id 之间建立关系吗?
  • 不,您正在创建 names.name 和 users.name_id 之间的关系。
  • 谢谢 :) 我误解了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多