SQL-1个表中有2个主键

时间:2018-12-02 16:54:25

标签: sql database oracle primary-key

我已经研究这个问题好几个星期了,尽管有本站点和其他站点上的资源,我也找不到任何合适的例子来引导我朝着正确的方向前进。对于一项任务,我试图在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

4 个答案:

答案 0 :(得分:2)

在我的评论之后,我怀疑您想要的是一个复合主键-两列共同组成主键/唯一标识表中的一行。这与“具有两个主键”非常不同-每个列的值都可以重复,但是第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)

 );

答案 1 :(得分:0)

您不能创建两个主键。主键具有三个属性:

  • 它们是独一无二的。
  • 它们不是NULL。
  • 每个表只有一个。

这是第三个属性,可防止您拥有其中两个。您可以将一列或一组列声明为uniquenot null。但是,这样的一组键只能是 primary 键。

答案 2 :(得分:0)

  

主键约束将一列指定为主键的主键   表格或视图。复合主键指定   列作为主键

Oracle不允许在一个表或视图上使用多个主键。寻找主键约束 https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

答案 3 :(得分:0)

主键具有三个属性:

  1. 它不能为空。
  2. 这是独一无二的。
  3. 它永远不会改变。

因此,尽管Oracle仅允许您为每个表定义一个主键约束,但是您可以通过以下方式轻松地创建具有主键的所有属性的第二,第三或第四列:

  1. 为列提供NOT NULL约束。
  2. 在列上创建UNIQUE约束。
  3. 在一堆Hershey条形包装纸(巧克力是神圣的!:-)上来回穿梭,您将永远不会改变约束中任何列的值。如果您希望强制执行此操作,则可以使用触发器。