我正试图在PHP表单中使用此触发器。我尝试过以下操作,但在提交表单时,仍会在表中插入空行。
$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
因为CCD_ 1将意味着其中一个值(至少)不是空的。
第二,@tofutim是正确的;空字符串与CCD_ 2值不同。
如果我理解你的逻辑,这行不应该是:
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
假设你的名字是"克里斯蒂安·吉尔伯特"。其中只有一行(其中一个代理ID号)是您的。是哪一个?
想想这是否真的是你想要做的。我对数据库约束的第一条经验法则是:dbms允许的一切最终都会进入你的数据库。(我曾经看到《财富》500强的一个IT部门发布了一款应用程序,允许用户输入集装箱的负尺寸。这样你就可以把很多箱子装进火车车厢。在纸上。)
IMHO,这三列中的每一列都应该声明为NOT NULL。我也会投票支持其他这样说的人。
(姓名由The Random Name Generator提供。)