2017-11-20 7 views
1

特定の一意の用語を使用してテーブルの設計に役立つ必要があります。 テーブルは次のようになります。他の列の値の差がある場合にのみSQL SERVER UNIQUE

id --> Primary key auto generate 
type1 --> varchar(20) 
type2 --> varchar(20) 
code --> int 

コード列は一意ですが、type2列の値が同じ場合にのみ同じ値が許可されます。

1 xyz freedom 6773 
2 asd freedom 6773 
3 rty prison 6773 --> not allowed 
4 pop prison 7809 
+0

これはデータベースで行うよりもサーバー側のコードで行うことができると思います。このような機能がSQL Serverによって提供されているかどうかはわかりませんが、このテーブルにデータを挿入するときにサーバー側でプログラミングすることでそのようなケースを実装しています。 –

答えて

2

variatでは、(code、type2)のすべての組み合わせが可能な追加の表を使用できます。

CREATE TABLE checkTable(
    code int NOT NULL, 
    type2 varchar(20) NOT NULL, 
CONSTRAINT PK_checkTable_code PRIMARY KEY(code), 
CONSTRAINT UK_checkTable_type2 UNIQUE(type2), 
CONSTRAINT UK_checkTable_code_type2 UNIQUE(code,type2) -- it's using for FK in your table 
) 

CREATE TABLE yourTable(
    id int IDENTITY NOT NULL, 
    type1 varchar(20), 
    type2 varchar(20), 
    code int, 
CONSTRAINT PK_yourTable PRIMARY KEY(id), 
CONSTRAINT FK_yourTable_code_type2 FOREIGN KEY(code,type2) REFERENCES checkTable(code,type2) 
) 

あなたが望むものを正しく理解してくれることを願っています。

0

同じ値を挿入したい場合は、コードをUNIQUE列として定義することはできません。

あなたのケースでは、id(自動増加プライマリキー)を削除し、type02 +コードを複合プライマリキーとして作成することをお勧めします。

0

あなたがあなたのアプリケーションでの検証を処理する必要がある条件(インデックスに条件を置くことも可能ではありません)

があっても同じ値を許可する場合は、列を一意にすることはできません。

1

私は以下の...トリガーがあなたのケースで便利かもしれないと思うには、擬似コード

create trigger trg_test 
on table1 
after insert 
as 
begin 

if exists(
Select * from inserted i 
      join 
      tab1e1 t1 
      on t1.code=i.code and i.type2<>t1.type2 
     ) 
Rollback; 
end 

いくつかのテストです::

コード以下

はコードの下

insert into table1 
values 
('prison',6773) 

を失敗しました成功しました

insert into table1 
values 
('prison',6774) 
関連する問題