【问题标题】:Cannot make foreign key field nullable with Sequel Pro无法使用 Sequel Pro 使外键字段可以为空
【发布时间】:2012-07-24 21:43:57
【问题描述】:

我将我的用户表定义为外键,但不一定需要设置它们。 IE。不得有相关记录。

在我的 MySQL 编辑器 (Sequel Pro) 中,我无法将 addressId 设为“允许为空”。它忽略输入。我正在使用最新版本。

当我在没有 addressId 的用户表中创建新条目时,它显示“无法添加或更新子行:外键约束失败...”。但我希望能够添加没有地址的用户!这可能吗?

或者我应该简单地删除外键?这样做的缺点是什么?

CREATE TABLE `User1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` char(32) DEFAULT NULL,
  `addressId` int(11) NULL DEFAULT '0',
  `created` datetime DEFAULT NULL,
  `activated` datetime DEFAULT NULL,
  `lastLogin` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`addressId`),
  KEY `FK_User_Locale` (`localeId`),
  KEY `FK_User_Address` (`addressId`),
  CONSTRAINT `FK_User_Address` FOREIGN KEY (`addressId`) REFERENCES `Address` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

  • 我会删除外键约束。IMO 使用数据库来强制引用完整性是一种资源浪费。另外,当您重命名列和表时,这是一场噩梦。编写强大的服务器脚本是一种更好的方法。
  • @dano 永远不要重命名列和表。更糟糕的噩梦是发现您认为强大的脚本实际上很弱,并且您的数据失去了完整性。

标签: mysql foreign-keys sequelpro


【解决方案1】:

为什么不通过设置 foreign_key_checks=0 来禁用 foreign_key_checks

如果它不符合您的要求,您可以DROP 约束!

如果设置为 1(默认值),InnoDB 表的外键约束 被检查。如果设置为 0,它们将被忽略。禁用外键 检查对于按顺序重新加载 InnoDB 表很有用 与他们的父/子关系所要求的不同。

【讨论】:

  • 那么把外键声明全部删除不是更有意义吗?
  • 是的,这是你的愿望!如果您不需要任何参照完整性,则可以将其删除。无论如何,我已经相应地编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2021-09-20
  • 1970-01-01
  • 2012-08-26
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多