2016-12-14 64 views
0

我有一個名爲(art_almacen)的表,其中包含倉庫(calmacen)中的文章(carticle),現在,我如何檢查(使用約束)任何倉庫都有重複的文章?例如:創建一個約束來檢查列的值

如果我有一個Id = 3的倉庫,它有3篇文章(1,2,3),當我嘗試添加另一篇文章時,例如3,阻止我,因爲倉庫3已經擁有文章3

這是我的表SQL

CREATE TABLE public.art_almacen 
(
    cart_almacen integer NOT NULL DEFAULT nextval('seq_art_almacen'::regclass), 
    calmacen integer NOT NULL, 
    carticulo integer NOT NULL, 
    cant numeric(11,2) NOT NULL, 
    CONSTRAINT fk_art_almacen PRIMARY KEY (cart_almacen) 
    USING INDEX TABLESPACE sistema_index 
) 

使用PostgreSQL

+0

如果你創建一個主鍵,將採取不允許重複的 –

+0

我不能涉及所有權的身體...... –

+0

但主關鍵不能重複值,如果我添加倉庫1中的文章3這不是重複的值。 。 。 @VaoTsun – JuJoGuAl

回答

1

創建複合PK:

t=# CREATE TABLE public.art_almacen 
(
    cart_almacen serial,--integer NOT NULL DEFAULT nextval('seq_art_almacen'::regclass), 
    calmacen integer NOT NULL, 
    carticulo integer NOT NULL, 
    cant numeric(11,2) NOT NULL, 
    CONSTRAINT fk_art_almacen PRIMARY KEY (cart_almacen,calmacen) 
    USING INDEX TABLESPACE sistema_index 
) 
; 
CREATE TABLE 
t=# insert into public.art_almacen select 1,1,1,1; 
INSERT 0 1 
t=# insert into public.art_almacen select 1,2,1,1; 
INSERT 0 1 
t=# insert into public.art_almacen select 2,1,1,1; 
INSERT 0 1 
t=# insert into public.art_almacen select 2,2,1,1; 
INSERT 0 1 
t=# insert into public.art_almacen select 1,2,1,1; 
ERROR: duplicate key value violates unique constraint "fk_art_almacen" 
DETAIL: Key (cart_almacen, calmacen)=(1, 2) already exists. 
+0

那麼是最大的解決方案!,但我還有一個問題,你爲什麼使用序列?是更好? – JuJoGuAl

+0

no - 只是一個快捷方式來整型NOT NULL DEFAULT nextval('seq_art_almacen':: regclass)' - 看看https://www.postgresql.org/docs/9.5/static/datatype-numeric.html#DATATYPE-SERIAL –

3

看起來你需要在兩列(wirehouse,文章)的UNIQUE CONSTRAINT。在這種情況下,數據庫不會允許您擁有兩個具有相同倉庫和物品組合的行。像這樣的:

CREATE TABLE example (
    a integer, 
    wirehouse integer, 
    article integer, 
    UNIQUE (wirehouse, article) 
);