【问题标题】:Cannot add foreign key constraint when value is NULL?值为 NULL 时无法添加外键约束?
【发布时间】:2016-04-05 06:48:35
【问题描述】:

我使用CodeIgniter 开发我的应用程序,我为此表插入了一个约束:

约会

CREATE TABLE IF NOT EXISTS `appointments` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`GroupID` int(11) NOT NULL,
`book_datetime` datetime DEFAULT NULL,
`start_datetime` datetime DEFAULT NULL,
`end_datetime` datetime DEFAULT NULL,
`notes` text,
`hash` text,
`is_unavailable` tinyint(4) DEFAULT '0',
`guid_users_provider` char(36) DEFAULT NULL,
`guid_users_customer` char(36) DEFAULT NULL,
`guid_services` char(36) DEFAULT NULL,
`id_google_calendar` text,
`resources_guid` char(36) DEFAULT NULL,
`data` int(11) NOT NULL,
`lastUpdated` varchar(36),
PRIMARY KEY (`id`),
KEY `guid_users_customer` (`guid_users_customer`),
KEY `guid_services` (`guid_services`),
KEY `guid_users_provider` (`guid_users_provider`),
KEY `resources_guid` (`resources_guid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

资源

CREATE TABLE IF NOT EXISTS `resources` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`GUID` char(36) NOT NULL UNIQUE,
`descrizione` varchar(255) NOT NULL,
`sigla` varchar(255) NOT NULL,
`planning` varchar(255) NOT NULL,
`hex_color` varchar(255) NOT NULL,
`data` int(11) NOT NULL,
`lastUpdated` varchar(36),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

这是约束:

ALTER TABLE `appointments`
ADD CONSTRAINT `appointments_ibfk_5` FOREIGN KEY (`resources_guid`) REFERENCES `resources` (`GUID`) ON DELETE CASCADE ON UPDATE CASCADE;

架构已正确构建,但问题是当我尝试通过我的应用程序插入记录时,特别是字段resource_guid 有时是NULL。现在,如果我在PhpMyAdmin 中插入一条记录进行测试,在appointments 表中并将resource_guid 设置为空,则成功添加记录,但是当我在CodeIgniter 上从我的应用程序中插入记录时,我得到了这个错误:

无法添加或更新子行:外键约束失败 (scheduler.appointments, CONSTRAINT appointments_ibfk_5 FOREIGN KEY (resources_guid) REFERENCES resources (GUID) ON DELETE CASCADE ON UPDATE CASCADE)\",\"上一个\":null,\

现在这是查询的内容array

array(12) {
["guid_users_provider"]=>
string(36) "EE36D621-5E29-4674-81CB-B98622153E0C"
["start_datetime"]=>
string(19) "2015-12-30 23:19:00"
["end_datetime"]=>
string(19) "2015-12-31 00:45:00"
["notes"]=>
string(0) ""
["resources_guid"]=>
string(4) "null"
["is_unavailable"]=>
bool(false)
["guid_users_customer"]=>
string(36) "CDB8C010-7E51-4478-A341-F077E0460C88"
["guid_services"]=>
string(36) "31C40686-D72C-4361-B211-DCB2223552A9"
["book_datetime"]=>
string(19) "2015-12-31 01:12:39"
["hash"]=>
string(32) "5a9882faec12ab5bacb3445382176463"
["lastUpdated"]=>
string(27) "31-12-2015 10:12:39.5659760"
["GroupID"]=>
int(1)
}

您如何看到字段resource_guid 为NULL。现在我不明白的是(如果我在PhpMyAdmin 中插入这个resource_guid 设置为NUll,所以空字段,不会显示错误,也从我的应用程序出现上面的错误)。
像这样将该数组传递给CodeIgniterinsert 方法:

if(!$this->db->insert('appointments', $appointment))
{
        throw new Exception("Can't add record=> " . $this->db->_error_message());
}

当为 NULL 时如何插入资源?我的意思是,在我的数据库表结构中,对空值没有限制,实际上appointments 表中的设置是DEFAULT NULL。有人可以帮助我吗?

【问题讨论】:

    标签: mysql sql database codeigniter


    【解决方案1】:

    看看你的输入resources_guid

    ["resources_guid"]=> string(4) "null"
    

    这是一个string,其值为"null",而不是booleanNULL

    请检查您是如何创建该输入的。确保返回一个实际的 NULL 值。如果您对此没有控制权,您可能需要通过这种方式手动更改它:(假设数组为$appointment

    if($appointment["resources_guid"] == "null") {
         $appointment["resources_guid"]  = NULL;
     }
    

    关于FOREIGN KEY,它应该可以按照您的设置工作。子字段中NULL的值应该没有问题(除非该字段设置为NOT NULL)。

    【讨论】:

      【解决方案2】:

      在您的Appointments 表中,您已将默认值指定为NULL

      改为将empty 值设为默认值。

      resources_guid` char(36) NOT NULL DEFAULT ''
      

      要将现有列设为 NOT NULL,请使用 MODIFY

      ALTER TABLE Appointments MODIFY resources_guid char(36) NOT NULL DEFAULT ''
      

      【讨论】:

      • 如果我插入不为空,则会出现此错误:'resources_guid' 不能为空
      • 使用 ALTER TABLE 约会 MODIFY resources_guid INT(11) char(36) NOT NULL DEFAULT ''
      • 为什么是 int(11) 和后来的 char (36) ?无论如何,#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“ALTER TABLE 约会修改资源_guid INT(11) char(36) NOT NULL D”附近使用正确的语法
      • 哎呀..我的错误..删除 int ,只是 char
      • 现在我无法添加记录:列'resources_guid'不能为空
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2020-09-12
      • 2017-07-16
      • 2013-03-10
      • 2021-11-05
      • 2018-02-13
      相关资源
      最近更新 更多