繁体   English   中英

PHP/MySQL:如何防止插入所有列 = NULL 的行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM