我已经研究这个问题好几个星期了,尽管有本站点和其他站点上的资源,我也找不到任何合适的例子来引导我朝着正确的方向前进。对于一项任务,我试图在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
答案 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)
您不能创建两个主键。主键具有三个属性:
这是第三个属性,可防止您拥有其中两个。您可以将一列或一组列声明为unique
和not null
。但是,这样的一组键只能是 primary 键。
答案 2 :(得分:0)
主键约束将一列指定为主键的主键 表格或视图。复合主键指定 列作为主键。
Oracle不允许在一个表或视图上使用多个主键。寻找主键约束 https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm
答案 3 :(得分:0)
主键具有三个属性:
因此,尽管Oracle仅允许您为每个表定义一个主键约束,但是您可以通过以下方式轻松地创建具有主键的所有属性的第二,第三或第四列: