0

複合 pk を使用する場合、値の挿入は同じにできますか? 皆さんに例を示します。

テーブルの作成:

Create table test
(
testno number(5) not null,
testpaper varchar(2) not null,
time date
CONSTRAINT Pa_Pks PRIMARY KEY (testno, testpaper) 
)

次に、これは私が挿入したい値です:

Testno          Testpaper         Time
12345           22                14-JUL-2011
12345           23                15-JUL-2011
12345           22                16-JUL-2011

ご覧のとおり、挿入時に主キーの値が同じであることがわかります。私がそれをしたい理由は、同じテスト番号とテストペーパーが異なる日付に発生する可能性があるためです.

同じ値を追加したいが、主キーとしてラベルを付けたい場合はどうすればよいですか?

これは、標準的で正しい方法である必要があります。

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid) 
)

明確にしていただきありがとうございます。

4

2 に答える 2

2

いいえ、それはできません。主キーは一意である必要があります。ただし、できることは、キーの一部としてテスト時間を追加できることです。または、Idとして別の列名を付けることができます。これは、自動インクリメントキーになります。したがって、主キーはID(自動インクリメント)になります。

Oracleでは、AutoIncrement Keyが必要な場合は、シーケンスを記述してトリガーする必要があります。シーケンスは単に一連の数字です。トリガーの目的は、新しい行が挿入されるたびに番号をインクリメントし、それを列IDに格納することです。、そして、Numberのサイズを大きくしたい場合もあります。Number(1)は、主キーに十分なサイズではない可能性があります(Oracleに自動インクリメントIDを持たせたい場合)またはSimpleでは、主キーに時間を追加できます。

標準は要件によって異なります。両方のアプローチに従います。

于 2011-11-19T09:31:01.083 に答える
0

timeが nullable の場合、a の一部を構成することはできませんPRIMARY KEYが、eUNIQUE制約の一部を構成することはできます。キーはキーであり、キーを「プライマリ」として指定することは任意であり、必須ではないことに注意してください。

代理キーとしての追加Testidは、最初に自然キーがある場合にのみ機能します。したがって:

いずれかの自然キーのみ:

Create table TEST
(
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);

OR 自然キーと代理キー:

Create table TEST
(
 Testid number(1) not null,
 testno number(5) not null,
 testpaper varchar(2) not null,
 time date, 
 CONSTRAINT Pa_Pks PRIMARY KEY (Testid), 
 CONSTRAINT Pa_Uqs UNIQUE (testno, testpaper, time) 
);
于 2011-11-21T10:27:53.770 に答える