2013-06-21 38 views
0

我有两个表:父和子。其中一个子列引用带有FOREIGN KEY约束的父PRIMARY KEY - child.parent_id引用parent.parent_id。如何将空值从HTML表单传递到MySQL数据库外键字段

子表中的外键列允许NULL值,因为当孩子被创建时父可能还不知道。但是当关于父母的信息将被分配/更新时,我想要具有参照完整性。

现在的问题:

如何将空值从HTML表单传递给MySQL?引号''或'“不工作”外键约束失败“可能是因为它传递空字符串而不是空值。或者也许我需要在PHP中做一些额外的检查并将其转换为空?

CREATE TABLE IF NOT EXISTS `parent` (
    `parent_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(20) NOT NULL, 
    `surname` varchar(20) NOT NULL, 
    PRIMARY KEY (`parent_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `child` (
`child_id` int(11) NOT NULL AUTO_INCREMENT, 
`child_name` varchar(20) NOT NULL, 
`parent_id` int(11) DEFAULT NULL, 
PRIMARY KEY (`child_id`), 
KEY `fk_parent_id` (`parent_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

ALTER TABLE `child` 
    ADD CONSTRAINT `fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`); 

回答

0

您需要将您的空值转换为空或在PHP中编辑您的查询。

0

当您的表格不支持父值中的NULL值时,为什么要传递NULL值?

`parent_id` int(11) DEFAULT NULL, 

应该是NOT NULL作为一个孩子应该总是有一个父母。

如果您尝试从HTML表单传递父/子标识符,我建议您在PHP代码中验证它们的服务器端。因为我可以轻松地操纵标记中的值并添加任何我希望的父/子组合。

+0

我想允许在子表中使用空值,因为在创建子进程时父进程可能仍然是未知的,并且稍后会创建关系。为了简单起见,我省略了验证,验证不会将其转换。 – czomberzdaniela

+0

@czomberzdaniela - 你不能那样做。您有一个外键约束,指出子表中的parent_id必须引用父表中的ID。如果您创建的子记录没有有效的父ID,则该约束将被违反。 –

+0

是的你可以。 INSERT INTO'foreign_test'.'child'('child_id','child_name','parent_id')VALUES(NULL,'Jack',NULL);工作正常。你也可以从phpMyAdmin中做到这一点。 – czomberzdaniela

相关问题