PHP / MySQL: как предотвратить вставку строки со всеми столбцами = NULL? - PullRequest
2 голосов
/ 30 мая 2011

Я пытаюсь использовать этот триггер в форме 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.');

Ответы [ 4 ]

2 голосов
/ 30 мая 2011

Прежде всего, я думаю, что вы имеете в виду

IF COALESCE(first_name, last_name, affiliation) IS NULL

потому что NOT NULL будет означать, что одно из значений (по крайней мере) не является нулевым.

Во-вторых, @tofutim - это правильно; пустые строки не совпадают с NULL значениями.

1 голос
/ 30 мая 2011

Предположим, что ваш триггер, измененный в соответствии с уже предоставленными отличными ответами, работает, чтобы гарантировать, что хотя бы один атрибут из набора {first_name, last_name, affiliation} не равен нулю. Предполагая, что у вас также есть суррогатный ключ для идентификационного номера, в этой таблице могут быть такие данные. (Я не знаю, что вы подразумеваете под принадлежностью, поэтому для этого я просто использую символ (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

Допустим, вас зовут "Кристиан Гильберт". Только одна из этих строк (одна из этих суррогатных идентификационных номеров) принадлежит вам. Какой это?

Подумайте, действительно ли это то, что вы хотите сделать. Мое первое практическое правило для ограничений базы данных: все, что позволяет dbms, в конечном итоге попадет в вашу базу данных. (Однажды я видел, как ИТ-отдел Fortune 500 выпустил приложение, которое позволяло пользователям вводить отрицательные размеры для транспортных контейнеров. Таким образом, в вагон можно поместить много коробок. На бумаге.)

ИМХО, каждый из этих трех столбцов должен быть объявлен как NOT NULL. И я собираюсь поддержать всех остальных, кто тоже так говорит.

(Имена любезно предоставлены Генератор случайных имен .)

1 голос
/ 30 мая 2011

Для триггера должна быть указана виртуальная таблица 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

1 голос
/ 30 мая 2011

Если я понимаю, ваша логика не должна эта строка:

IF COALESCE(first_name, last_name, affiliation) IS NOT NULL THEN

Be

IF COALESCE(first_name, last_name, affiliation) IS NULL THEN

В противном случае вы потерпите неудачу, только когда есть значение, которое не является нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...