我試圖阻止用戶在表中插入超過 1 個唯一的字串陣列。
我創建了一個唯一約束陣列上:CONSTRAINT users_uniq UNIQUE(usersArray),
但是用戶仍然可以將相同的值插入到陣列中,但順序不同。我的表:
| ID | 用戶陣列 |
|---|---|
| 1 | {011,123} |
| 2 | {123,011} // 不應該 |
輸入:{011,123} --> error unique // 正確的錯誤
Input : {123,011} --> Worked // 應該回傳一個錯誤
如何使值 {123,011} 和 {011,123} 被視為相同?
uj5u.com熱心網友回復:
強制執行陣列中專案順序的觸發器可能是一種方法。下面是一個例子:
小提琴
CREATE TABLE test ( arr int ARRAY, unique (arr) );
CREATE FUNCTION test_insert_trig_func()
RETURNS trigger AS $$
BEGIN
NEW.arr := ARRAY(SELECT unnest(NEW.arr) ORDER BY 1);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER test_insert_trig
BEFORE INSERT ON test
FOR EACH ROW
EXECUTE PROCEDURE test_insert_trig_func()
;
INSERT INTO test VALUES ('{1, 2}');
INSERT INTO test VALUES ('{2, 1}'); -- Generates a unique constraint violation
SELECT * FROM test;
結果:
| 阿爾 |
|---|
| {1,2} |
uj5u.com熱心網友回復:
觸發器解決方案并不透明,因為它實際上是在修改資料。這是一個替代方案。創建array_sort輔助函式(它可能對其他情況也很有用)和使用它的唯一索引。
create or replace function array_sort (arr anyarray) returns anyarray immutable as
$$
select array_agg(x order by x) from unnest(arr) x;
$$ language sql;
create table t (arr integer[]);
create unique index tuix on t (array_sort(arr));
演示
insert into t values ('{1,2,3}'); -- OK
insert into t values ('{2,1,3}'); -- unique violation
select * from t;
| 阿爾 |
|---|
| {1,2,3} |
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399493.html
標籤:sql PostgreSQL的
