0

複合キーを使用してテーブルを作成したいのですが、その組み合わせは一意でなければなりません。

例えば、

CREATE TABLE [dbo].[TEST3](
    [field1][int] NOT NULL,
    [field2][int] NOT NULL
PRIMARY KEY (field1,field2)
)
GO

行:

field1    field2
----------------
   1        2
   2        1

そのような行動を防ぐにはどうすればよいですか?2,1行 ( ) が既にあるテーブルにユーザーが行 ( ) を1,2挿入すると、エラーが発生する必要があります。

4

2 に答える 2

2

ユーザー定義型を使用してそれを行うことができるかもしれませんが、私見では、これは設計が悪く、おそらく XY 問題のように思えます。

多対多のテーブル (相互の友人のためのテーブルなど) を作成しようとしている場合は、代わりにチェック制約を使用して、field1が厳密に 未満であることを常に確認することをお勧めしfield2ます。

さらに一歩進んで、ストアド プロシージャを使用して行を挿入したり、INSTEAD OF INSERTトリガーを作成したりすることもできます。これにより、行が適切な順序で配置されます。このようにして、列の順序をフロントエンドに依存する必要がなくなります。

于 2013-03-01T15:46:28.530 に答える
1

いくつかの挿入(および更新)トリガーが可能な解決策です。

create trigger prevent 
on TEST3 
for insert 
as 
if (select count(1) 
    from TEST3, inserted 
    where TEST3.field1=inserted.field2 and TEST3.field2=inserted.field1) > 0  
/* Cancel the insert and print a message.*/
  begin
    rollback transaction 
    print "Failed." 
  end  
/* Otherwise, allow it. */
else
  print "Added!"
于 2013-03-01T15:53:24.670 に答える