我目前在postgres 14下作業。我有兩個表customers和contacts,當我在表contacts中添加新聯系人時,我想從客戶名稱中自動找到customer_id。
CREATE TABLE customers(
customer_id INT GENERATED ALWAYS AS IDENTITY,
customer_name VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY(customer_id)
);
CREATE TABLE contacts(
contact_id INT GENERATED ALWAYS AS IDENTITY,
customer_id INT,
contact_name VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY(contact_id),
CONSTRAINT fk_customer
FOREIGN KEY(customer_id)
REFERENCES customers(customer_id)
);
INSERT INTO customers(customer_name) VALUES('my_first_customer')
所以從這里我想做這樣的事情:
INSERT INTO contacts(customer_id, contact_name ) VALUES('my_first_customer',"thomas")
我想在聯系人表中得到這個結果:
| 聯系人 ID | 客戶ID | 聯系人姓名 |
|---|---|---|
| 1 | 1 | “托馬斯” |
我試圖創建一個函式來將值從名稱更改為 id,但出現型別錯誤。因為型別錯誤是在觸發之前捕獲的。這是我的功能
CREATE FUNCTION get_id_fct()
RETURNS TRIGGER AS $get_id_fct$
DECLARE val_id INTEGER;
BEGIN
SELECT customer_id INTO val_id FROM customers WHERE customers.customer_id = NEW.customer_id;
NEW.customer_id := val_id;
RETURN NEW
END
$get_id_fct$ LANGUAGE plpgsql;
CREATE TRIGGER get_id
BEFORE INSERT ON contacts
FOR EACH ROW EXECUTE PROCEDURE get_id_fct();'
他們有辦法解決嗎?或執行此任務的具體方法,我不知道?我是 SQL 的初學者。
uj5u.com熱心網友回復:
您可以在插入陳述句中進行子查詢
INSERT INTO contacts(customer_id, contact_name ) VALUES (
(select customer_id from customers where customer_name = 'my_first_customer') ,'thomas');
如果有多個具有給定名稱的客戶,此查詢將失敗,如果沒有給定名稱的客戶,則為 customer_id 插入空值
不同的方法(由@wildplasser 提出)
INSERT INTO contacts(customer_id, contact_name )
select customer_id,'thomas' from customers where customer_name = 'my_first_customer';
在這種情況下,當沒有給定名稱的客戶時,不會創建任何行。當有多個具有給定名稱的客戶時,將為每個客戶創建記錄。
或者您可以使用INSTEAD OF觸發器創建視圖。
create view v_contacts as
select customer_name, contact_name from customers
join contacts on customers.customer_id = contacts.customer_id;
CREATE FUNCTION emp () RETURNS trigger AS $$
BEGIN
INSERT INTO contacts(customer_id, contact_name )
VALUES((select customer_id from customers where customer_name =
NEW.customer_NAME),NEW.contact_NAME);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER v_contactst
INSTEAD OF INSERT ON v_contacts
FOR EACH ROW
EXECUTE FUNCTION emp();
插入陳述句
INSERT INTO v_contacts(customer_name, contact_name ) VALUES('my_first_customer','thomas')
只是請注意,這些列customer_name不是contact_name唯一的,因此此代碼不安全,如果customer_name不存在或有多個記錄,則此代碼不安全并拋出錯誤customer_name
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482500.html
標籤:sql PostgreSQL 触发器 外键
下一篇:SQLServer分組資料
