Столкнулся к не совсем понятным поведением Firebird при частичном заполнении необязательных полей, входящих в уникальный индекс.
Поясню примером.
Имеется такая таблица.
Код: Выделить всё
CREATE TABLE T (
ID INTEGER NOT NULL,
A INTEGER,
B INTEGER
);
ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);
ALTER TABLE T ADD CONSTRAINT UNQ1_T UNIQUE (A, B);
Код: Выделить всё
insert into t values(1,10,null);
insert into t values(2,10,null);
Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "UNQ1_T" on table "T".
PS: Не сочтите за офтоп, но в порядке сравнения в MySQL все работает именно так, как я и ожидал.
Код: Выделить всё
CREATE TABLE IF NOT EXISTS `t` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNQ1_T` (`a`,`b`),
KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Дамп данных таблицы `t`
--
INSERT INTO `t` (`id`, `a`, `b`) VALUES
(1, 10, NULL),
(2, 10, NULL);