Почему этот код дает мне ошибку, хотя все кажется правильным? - PullRequest
0 голосов
/ 28 сентября 2018

Вот мои 3 таблицы.

Service  (Serviceid,service_type,sname,ratings,address,due_date,company)
Hotel    (hotelid,address,ratings,hotel_name,cityid)
Insurance(insuranceid,company,due_date)

Всякий раз, когда в таблицу отелей вносится вкладка, ее hotelanme, рейтинги, адрес, hotelid должны также указываться в таблице услуг.

INSERT INTO HOTEL VALUES(NEXTVAL('HOTELSQ'),'123,APPLE STREET',5.0,'GRAND BHAGVATI HOTEL',1003);

Вот мой код Trigger в postgres.

CREATE OR REPLACE FUNCTION INSERTFORHOTEL()
RETURNS TRIGGER AS 
$$
BEGIN
INSERT INTO SERVICE(SERVICEID,SNAME,SERVICE_TYPE,RATINGS,ADDRESS) VALUES (NEW.HOTELID,NEW.HOTEL_NAME,'HOTEL',NEW.RATINGS,NEW.ADDRESS);
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER INSERTHOTEL BEFORE INSERT ON HOTEL
FOR EACH ROW EXECUTE PROCEDURE INSERTFORHOTEL();

Триггер запущен успешно, но когда я вставляю запись, как указано выше, она выдает следующую ошибку.

ERROR:  duplicate key value violates unique constraint "service_pkey"
DETAIL:  Key (serviceid)=(3524) already exists.
CONTEXT:  SQL statement "INSERT INTO SERVICE(SERVICEID,SNAME,SERVICE_TYPE,RATINGS,ADDRESS) VALUES (NEW.HOTELID,NEW.HOTEL_NAME,'HOTEL',NEW.RATINGS,NEW.ADDRESS)"
PL/pgSQL function insertforhotel() line 3 at SQL statement
SQL state: 23505

И запись не вводится ..

Я сделал то же самое для страховой таблицы.Добавление записи в таблицу страхования также вставляет запись в таблицу Service, это сделано успешно.Но столик в отеле остается ..

1 Ответ

0 голосов
/ 28 сентября 2018

Если у вас одинаковый код триггера для hotel и insurance, возможно, у вас конфликтующее понятие.

Вы добавляете INSURANCE_ID как SERVICE_ID, а также HOTEL_ID как SERVICE_IDINSURANCE_ID, и HOTEL_ID являются последовательностями.Поэтому, если в таблице insurance есть новая строка 42, вы добавляете 42 как SERVICE_ID в таблицу service.Но если вы получите 42-ю строку в вашей таблице hotel, у вас возникнет проблема, потому что вы больше не сможете добавить 42 как SERVICE_ID в вашу таблицу.Он уже существует из вашего insurance ввода.Это уникальное нарушение ограничения.

Вам не следует копировать свои идентификаторы как новые SERVICE_ID.Создайте собственный столбец SERVICE_ID (тип serial - или в случае Postgres 10 и выше GENERATED AS IDENTITY), а затем вы можете взять другие идентификаторы в качестве ссылки в отдельномстолбец без уникального ограничения.

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