[英]PHP/MySQL: how to prevent insertion of a row with all columns = NULL?
我正在尝试在 PHP 表单中使用此触发器。 我已经尝试了以下方法,但是当我提交表单时,我仍然会在我的表中插入 null 行。
$trigger="DELIMITER $$
CREATE TRIGGER check_not_all_null BEFORE INSERT ON agent FOR EACH ROW
BEGIN
IF COALESCE(first_name, last_name, affiliation) IS NOT NULL THEN
CALL fail('All fields cannot be null');
END IF;
END $$
DELIMITER ; ";
$execute = mysql_query($trigger);
$query4 = "INSERT INTO agent
(first_name, last_name, affiliation)
VALUES
('$first_name', '$last_name', '$affiliation')";
$result4 = mysql_query($query4, $connection) or die('Error querying database.');
首先,我认为你的意思是
IF COALESCE(first_name, last_name, affiliation) IS NULL
因为NOT NULL
意味着其中一个值(至少)不是 null。
其次,@tofutim 是正确的; 空字符串与NULL
值不同。
如果我理解你的逻辑不应该这一行:
IF COALESCE(first_name, last_name, affiliation) IS NOT NULL THEN
是
IF COALESCE(first_name, last_name, affiliation) IS NULL THEN
否则,只有当值不是 null 时,您才会失败。
触发器需要有new.
指定的虚拟表,否则它将永远无法工作。
您可能需要考虑将触发器更改为。
CREATE TRIGGER check_not_all_null BEFORE INSERT ON agent FOR EACH ROW
BEGIN
SET new.first_name = NULLIF(new.first_name, '');
SET new.last_name = NULLIF(new.last_name, '');
SET new.affiliation = NULLIF(new.affiliation , '');
IF COALESCE(new.first_name, new.last_name, new.affiliation) IS NULL THEN
CALL fail('All fields cannot be empty');
END IF;
END $$
这将强制将空字符串放入null
中。
请参阅: http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_nullif
并且: http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html
假设您的触发器(根据已提供的出色答案进行了修改)可确保集合 {first_name, last_name, affiliation} 的至少一个属性不是 null。 假设您还有一个 ID 号代理键,该表可能允许这样的数据。 (我不知道你所说的从属关系是什么意思,所以我只使用一个 char(1) 。)
ID first_name last_name affiliation
--
1 NULL NULL A
2 NULL NULL A
3 NULL Nethery B
4 Clare NULL C
5 Christian Guilbert A
6 Christian Guilbert A
7 Christian Armistead A
8 Hugh Marchal B
9 Sharron Sevier A
10 Christian Guilbert NULL
假设你的名字是“Christian Guilbert”。 这些行中只有一个(其中一个代理 ID 号)是您的。 哪一个?
想想这是否真的是你想要做的。 我对数据库约束的第一条经验法则:dbms 允许的一切最终都会找到进入数据库的方式。 (我曾经看到一个财富 500 强的 IT 部门发布了一个应用程序,允许用户输入集装箱的负尺寸。你可以通过这种方式将很多箱子装进火车车厢。在纸上。)
恕我直言,这三列中的每一列都应声明为 NOT NULL。 我也会投票给所有这么说的人。
(名称由随机名称生成器提供。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.