Кажется, в MySQL есть ошибка.Вот как я создал свои таблицы:
CREATE TABLE tiers_critere_int (
id bigint AUTO_INCREMENT NOT NULL,
date_debut_val datetime not null,
date_fin_val datetime **default NULL**,
id_tiers bigint(20) NOT NULL,
id_critere bigint(20) NOT NULL,
critere bigint(20) NOT NULL,
PRIMARY KEY (id,date_debut_val,date_fin_val),
KEY id (id),
KEY date_debut_val (date_debut_val),
KEY date_fin_val (date_fin_val),
KEY date_debut_val_2 (date_debut_val,date_fin_val),
KEY critere (critere),
KEY id_tiers (id_tiers),
KEY id_critere (id_critere),
FOREIGN KEY (id_tiers) REFERENCES tiers (id)
ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (id_critere) REFERENCES critere (id)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В tiers_critere_int
, date_fin_val
по умолчанию равно нулю .Это то, что ты думаешь.Но если вы сделаете:
mysql> update tiers_critere_int set date_fin_val= null;
Query OK, 0 rows affected, 3 warnings (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 3
mysql> show warnings;
+---------+------+--------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------+
| Warning | 1048 | Column 'date_fin_val' cannot be null |
| Warning | 1048 | Column 'date_fin_val' cannot be null |
| Warning | 1048 | Column 'date_fin_val' cannot be null |
+---------+------+--------------------------------------+
3 rows in set (0.00 sec)
mysql>
Проблема заключается в том, что MySQL допускает создание таблицы, но не принимает нулевые значения для ключей.Но что не является нормальным, так это то, что этот запрос работает, и это явно удивительно (или не нормально, это вам решать):
mysql> select * from tiers_critere_int
where date_fin_val is null;
+----+---------------------+---------------------+----------+------------+---------+
| id | date_debut_val | date_fin_val | id_tiers | id_critere | critere |
+----+---------------------+---------------------+----------+------------+---------+
| 1 | 2011-03-13 06:07:05 | 0000-00-00 00:00:00 | 1 | 2 | 86 |
| 2 | 2011-03-13 06:07:05 | 0000-00-00 00:00:00 | 1 | 6 | 170 |
| 3 | 2011-03-13 06:07:05 | 0000-00-00 00:00:00 | 1 | 7 | 65 |
+----+---------------------+---------------------+----------+------------+---------+
3 rows in set (0.00 sec)
mysql>
Так что это действительно сбивает с толку, и что более запутанно, так это то, чтопредложение "is null" правильно обрабатывается в предложении where (t.date_fin_val is null)
, но оно не обрабатывается должным образом в предложении and (tci.date_fin_val is null)
, тогда как в запросе то же самое , для таблиц, созданных то же самое Кстати, на те же столбцы.
Итак, конец истории: правильный запрос :
mysql> select t.id,t.date_fin_val,tci.date_fin_val
from tiers t
left outer join tiers_critere_int tci
on t.id=tci.id_tiers
where (t.date_fin_val ='0000-00-00 00:00:00')
and (tci.date_fin_val ='0000-00-00 00:00:00');
+----+---------------------+---------------------+
| id | date_fin_val | date_fin_val |
+----+---------------------+---------------------+
| 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+
3 rows in set (0.00 sec)
mysql>