【问题标题】:MySQL - Foreign key on delete set null in not null fieldMySQL - 在非空字段中删除设置空的外键
【发布时间】:2014-01-03 09:39:58
【问题描述】:

这可能是一个微不足道的问题,但在涉及外键约束时我仍然有点笨拙,所以我想确定一下。

假设我有一个表 countries 包含字段 country_id (PK) 和 name,还有一个表 cities 包含字段 city_id (PK)、namecountry_id ( FK)。

外键cities.country_id 具有约束ON DELETE SET NULL。据我了解,这意味着如果删除来自countries 的记录,则cities 中引用该已删除记录的country_id 的任何记录都将其country_id 字段设置为NULL。

但是,如果cities.country_id 具有NOT NULL 属性怎么办?这会阻止外键约束正常工作吗?这样做是有道理的,但我只是想检查一下。

【问题讨论】:

  • 简单的问题——你自己试过了吗?
  • 我正在尝试,但我通常只是先发布一个问题,因为有时需要一段时间才能得到回复。此外,我还阅读了一些最初并未出现在建议列表中的类似问题,这些问题提供了一些见解。

标签: mysql sql foreign-key-relationship create-table notnull


【解决方案1】:

如果您将ON DELETE SET NULL 设置为外键,则不允许您将该字段设置为NOT NULL

因此,您将无法在 CountryId

上创建或更改列为 NOT NULLON DELETE SET NULL 的表

当我运行以下语句时:

CREATE TABLE `country` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ;

CREATE TABLE `city` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `countryId` int(10) unsigned DEFAULT NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_country` (`countryId`),
  CONSTRAINT `FK_country` FOREIGN KEY (`countryId`) REFERENCES `country` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
);

我在MySQL 5.5 中得到的错误是:

Schema Creation Failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_country` (`countryId`),
  CONSTRAINT `' at line 4: 

【讨论】:

  • 你确定吗?因为我像这样在 MySQL Workbench 中创建了模型,它允许我导出和导入到 phpMyAdmin。我认为它不会阻止您创建它,但是当您尝试删除记录时它就不起作用了。
  • @Bobe 我曾在 MySQL 5.5 中尝试过,但无法更改我的表。错误是:Error on rename of '.\rptest\#sql-694_1' to '.\rptest\city' (errno: 150)
  • 嗯,我正在使用的服务器正在运行 MySQL 5.0.96。也许那个版本没有语法检查。
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多