составным индексом.
Делаю:
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'locality';
В ответе вижу:
locality_pkey | CREATE UNIQUE INDEX locality_pkey ON public.locality USING btree (id)
idx_e1d6b8e698260155 | CREATE INDEX idx_e1d6b8e698260155 ON public.locality USING btree (region_id)
idx_e1d6b8e6b08fa272 | CREATE INDEX idx_e1d6b8e6b08fa272 ON public.locality USING btree (district_id)
uniq_locality_in_district_and_in_region | CREATE UNIQUE INDEX uniq_locality_in_district_and_in_region ON public.locality USING btree (name, region_id, district_id)
Вот как раз последний индекс, который должен мешать.
Делаю несколько раз:
INSERT INTO public.locality
(region_id, district_id, "name")
VALUES(1612, null, 'Тестово');
Считываю и понимаю, что она реально кучу раз записалась:
common=# SELECT id, region_id, district_id, "name"
common-# FROM public.locality where name ilike '%тест%';
488 | 1612 | | Тестово
489 | 1612 | | Тестово
490 | 1612 | | Тестово
491 | 1612 | | Тестово
492 | 1612 | | Тестово
493 | 1612 | | Тестово
Почему нет ошибки по уникальному индексу?
потому что NULL никогда не равен другому NULL
Не знал, в мускуле равен. И как в данном случае решают проблему с PG?
IS NULL \ IS NOT NULL
пусть будет district_id = 0 ) если он не установлен
Тогда foreign key будет глючить
почему ? а с NULL не будет ? )
с null не будет, потому что отсутствие поля. Не ожидал я конечно такого прикола, что NULL не равен другому NULL. Ну за ответы всем спасибо, будем думать
Правда? А вот это что: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3a7acf6cca0699895340d700ec908a3e ? ;) Такое поведение соответствует ISO SQL, между прочим. С виду, ни та, ни другая СУБД не нарушает... нет?
Этого не может быть.
Это основы SQL, вообще-то. Т.е. стоит почитать какой-нибудь tutorial, в самом деле...
Окей пошел читать
You can insert NULL values into columns with the UNIQUE constraint because NULL is the absence of a value, so it is never equal to other NULL values and not considered a duplicate value. This means that it's possible to insert rows that appear to be duplicates if one of the values is NULL .
Да я уже прочитал, спасибо!
с чего это NULL не равен NULL ? И то и то пустые поля
А с чего это равен?
это не пустые поля это неопреденные поля
Обсуждают сегодня