簡體   English   中英

SQL-1個表中有2個主鍵

[英]SQL - 2 Primary Keys in 1 Table

我已經研究了這個問題好幾個星期了,盡管這個站點和其他站點上有很多資源,但我找不到合適的例子來引導我朝着正確的方向前進。 對於一項任務,我試圖在SQL中創建一個包含兩個PK的表。 我現在知道這是不可能的,但是我似乎無法理解為什么,主要是因為這是我所必需的。 我試圖更改代碼並分離鍵,但被告知這是不正確的,並堅持使用兩個PK。 任何幫助或指示將不勝感激。 這是我當前的表格代碼:

SQL> CREATE TABLE solds_ss /* This is creating the SOLDS table from the instance charts */
2      (
3           invoice_no     NUMBER(7)
4              CONSTRAINT invoice_no_pk PRIMARY KEY,
5              CONSTRAINT invoice_no_fk
6                 FOREIGN KEY (invoice_no)
7                 REFERENCES invoices_ss (invoice_no),
8           item_no     NUMBER(6)
9           CONSTRAINT item_no_pk PRIMARY KEY,
10             CONSTRAINT item_no_nn NOT NULL,
11             CONSTRAINT item_no_fk
12                FOREIGN KEY (item_no)
13                REFERENCES items_ss (item_no),
14          item_qty_sold     NUMBER(3)
15             CONSTRAINT item_qty_sold_nn NOT NULL,
16          item_price     NUMBER(6,2)
17             CONSTRAINT item_price_nn NOT NULL,
18          item_tracking_no     VARCHAR2(30)
19             CONSTRAINT item_tracking_no_nn NOT NULL
20     );
     CONSTRAINT item_no_pk PRIMARY KEY,
     *
ERROR at line 9:
ORA-02260: table can have only one primary key

根據我的評論,我懷疑您想要的是一個復合主鍵-兩列共同組成主鍵/唯一標識表中的一行。 這與“具有兩個主鍵”非常不同-每個列的值都可以重復,但是列1和列2的組合必須唯一:

InvoiceNo ItemNo
Inv1      Itm1
Inv1      Itm2
Inv2      Itm1
Inv2      Itm2

如果InvoiceNo是主鍵,或者ItemNo是主鍵,則不允許使用上面的表數據(如果單獨查看,每列包含重復的值),但是如果主鍵組合定義為InvoiceNo和ItemNo,則不允許

因此,我認為您正在尋找的sql更像是:

 CREATE TABLE solds_ss /* This is creating the SOLDS table from the instance charts */
 (
      invoice_no     NUMBER(7) NOT NULL,
      item_no     NUMBER(6) NOT NULL,
      item_qty_sold     NUMBER(3) NOT NULL,
      item_price     NUMBER(6,2) NOT NULL,
      item_tracking_no     VARCHAR2(30) NOT NULL,

         CONSTRAINT invoice_no_fk
            FOREIGN KEY (invoice_no)
            REFERENCES invoices_ss (invoice_no),
         CONSTRAINT item_no_fk
            FOREIGN KEY (item_no)
            REFERENCES items_ss (item_no),

         --composite pk
         CONSTRAINT solds_ss_pk PRIMARY KEY (invoice_no, item_no)

 );

您不能創建兩個主鍵。 主鍵具有三個屬性:

  • 他們是獨一無二的。
  • 它們是非NULL。
  • 每張桌子只有一個。

這是防止您擁有其中兩個的第三個屬性。 您可以將一列或一組列聲明為unique not null 但是只有一組這樣的鍵可以是鍵。

主鍵約束將一列指定表或視圖的主鍵 復合主鍵將列的組合指定為主鍵

Oracle不允許在一個表或視圖上使用多個主鍵。 查找主鍵約束 https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

主鍵具有三個屬性:

  1. 它不能為空。
  2. 它是獨一無二的。
  3. 它永遠不會改變。

因此,盡管Oracle僅允許您為每個表定義一個主鍵約束,但是您可以通過以下方式輕松地創建具有主鍵的所有屬性的第二,第三或第四列:

  1. 對列賦予NOT NULL約束。
  2. 在列上創建一個UNIQUE約束。
  3. 在一堆好時酒吧包裝紙(巧克力是神聖的!:-)上來回咒罵,您將永遠不會改變約束中任何列的值。 如果要強制執行此操作,可以使用觸發器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM