小编tak*_*sIV的帖子

是否可以将唯一约束设置为另一个表中的外键?

是否可以将唯一约束设置为另一个表中的外键?如果是的话,你会如何宣布它?

你会如何分配候选人钥匙?可能吗?

示例:我有一个产品表,其中包括:

prod_id, prod_name, prod_price, QOH
Run Code Online (Sandbox Code Playgroud)

我希望prod_name链接到发送表:

desp_id, prod_name, shelfLoc, quantity
Run Code Online (Sandbox Code Playgroud)

我在想的是我可能需要创建一个如下所示的唯一约束:

ALTER TABLE product
ADD CONSTRAINT prod_nameID_uc 
UNIQUE (prod_id,prod_name)
Run Code Online (Sandbox Code Playgroud)

我想知道的是,是否可以在发货表中将唯一密钥称为外键.我必须prod_name而不是prod_id在发货表中,以便信息在阅读时对用户更有意义,而不是看到ID号.我在oracle上使用iSQL plus.

oracle constraints foreign-keys unique

7
推荐指数
2
解决办法
4万
查看次数

ora-00933:SQL命令未正确结束

我有以下代码:

begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
      dbms_random.string('U',5),
      trunc(dbms_random.value(0000,9999)),
      prod_id from dba_xy.product 
              prod_name from dba_xy.product;        
end loop;
Run Code Online (Sandbox Code Playgroud)

结束;

当我运行它时,oracle给我以下错误消息:

prod_name from dba_xy.product;
                        *
Run Code Online (Sandbox Code Playgroud)

第8行的错误:ORA-06550:第8行,第29列:PL/SQL:ORA-00933:SQL命令未正确结束ORA-06550:第3行,第2列:PL/SQL:忽略SQL语句

我要做的是将现有的prod_id和prod_name与插入到发货表中的新数据相关联.我已将prod_name设置为product表中的唯一键,将prod_id设置为主键,并在despatch表中将两者都设置为外键约束.我需要将prod_name包含在despatch表中,以允许表的读者更多地了解需要找到的prod_name等,而不是仅仅给出对它们毫无意义的prod_id.但也许我认为我在发货表中不需要prod_id.请帮忙.

从发货表中删除prod_id列后,我改变了我的代码:

begin
for i in 1..2 loop
insert into dba_xy.despatch
select desp_id_seq.nextval,
      dbms_random.string('U',5),
      trunc(dbms_random.value(0000,9999)),
              prod_name from dba_xy.product;        
end loop;
Run Code Online (Sandbox Code Playgroud)

结束; /

并且出现以下关于唯一约束的错误消息:第1行的begin*ERROR:ORA-00001:违反ORA-06512的唯一约束(DBA_XY.PROD_NAME_UC):第3行

sql oracle plsql ora-00933 ora-00001

5
推荐指数
1
解决办法
5万
查看次数

标签 统计

oracle ×2

constraints ×1

foreign-keys ×1

ora-00001 ×1

ora-00933 ×1

plsql ×1

sql ×1

unique ×1