Отказ от ответственности : Я считаю, что ваша идея не очень хорошо продумана.Потому что на самом деле карты всегда заимствованы и используются другими лицами.Подумайте о человеке, который одалживает свою промо-карту своему другу.Он использует промо-карту со своей кредитной картой.Теперь кредитная карта используется женой друга, которая имеет промо-карту своего друга.Это может быть бесконечная история, и вы определенно будете отслеживать много разных пользователей.
demo: db <> fiddle
Только для вставки данныхв пустую или уже заполненную таблицу вы можете сделать это следующим образом:
Создать предполагаемую таблицу:
CREATE TABLE transactions (
id_promo int,
id_credit int,
id_customer int
);
Создать последовательность для подсчета id_customer
:
CREATE SEQUENCE seq_transaction_id_customer;
Создать функцию триггера: эта функция проверяет, есть ли уже клиент с таким же промо или номером кредитной карты.В этом случае соответствующий идентификатор предоставляется.В противном случае SELECT
будет NULL
, а COALESCE
генерирует новый идентификатор с помощью SEQUENCE
.
CREATE OR REPLACE FUNCTION set_id_customer() RETURNS trigger AS
$BODY$
DECLARE
_customer_id int;
BEGIN
SELECT DISTINCT id_customer
FROM transactions
WHERE NEW.id_promo = id_promo OR NEW.id_credit = id_credit
INTO _customer_id;
NEW.id_customer = COALESCE(_customer_id, nextval('seq_transaction_id_customer'));
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
Создайте триггер, который вызывает функцию каждый раз, когда новый набор данныхвставлен.
CREATE TRIGGER transaction_id_customer
BEFORE INSERT
ON transactions
FOR EACH ROW
EXECUTE PROCEDURE set_id_customer();
Рекомендую добавить индекс для id_promo
и id_credit
, если в вашей таблице столько строк.При этом производительность поиска существующего id_customer
будет значительно увеличена:
CREATE INDEX idx_transaction_promo
ON transaction(id_promo);
CREATE INDEX idx_transaction_credit
ON transaction(id_credit);
Чтобы обновить существующую таблицу для создания идентификаторов клиента, вы можете использовать функцию, которая перебирает все наборы данных.В принципе это должно выглядеть как функция триггера.