Sql 更改主键但获取错误
我正在尝试使用此更改表的主Sql 更改主键但获取错误,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试使用此更改表的主 ACCEPT p_oldserial PROMPT 'Enter Old Serial: '; ACCEPT p_newserial PROMPT 'Enter New Serial: '; INSERT INTO car (SELECT serial, cname, make, model, year, color, trim, enginetype, purchinv, purchdate, purchfrom, purchcost, freight, total
ACCEPT p_oldserial PROMPT 'Enter Old Serial: ';
ACCEPT p_newserial PROMPT 'Enter New Serial: ';
INSERT INTO car
(SELECT serial, cname, make, model, year, color, trim, enginetype, purchinv, purchdate, purchfrom, purchcost, freight, totalcost, listprice
FROM customer
WHERE serial='&p_oldserial');
UPDATE saleinv
SET serial='&p_newserial'
WHERE serial='&p_oldserial';
UPDATE serivceinv, saleinv;
DELETE FROM customer
WHERE serial='&p_oldserial';
COMMIT;
但我得到了ORA-02291。我的脚本中是否有错误?第一个问题是哪个语句失败。一次执行一条语句。我希望是DELETE语句
DELETE FROM customer
WHERE serial='&p_oldserial';
如果是这样,您还没有使用外键移动引用此行的所有记录。第二次更新是否应该读取
UPDATE serviceinv
SET serial='&p_newserial'
WHERE serial='&p_oldserial';
是否有其他表需要类似更新
正如其他人所指出的,主键通常被认为是不可变的。因此,这应该是一次性的改变。如果这可能是一个频繁的更改,那么您可能需要一个代理密钥。这将使更新减少到:
UPDATE car
SET serial='&p_newserial'
WHERE serial='&p_oldserial';
如果这可能是一个频繁的更改,并且您无法添加代理键,请查看级联选项。第一个问题是哪个语句失败。一次执行一条语句。我希望是DELETE语句
DELETE FROM customer
WHERE serial='&p_oldserial';
如果是这样,您还没有使用外键移动引用此行的所有记录。第二次更新是否应该读取
UPDATE serviceinv
SET serial='&p_newserial'
WHERE serial='&p_oldserial';
是否有其他表需要类似更新
正如其他人所指出的,主键通常被认为是不可变的。因此,这应该是一次性的改变。如果这可能是一个频繁的更改,那么您可能需要一个代理密钥。这将使更新减少到:
UPDATE car
SET serial='&p_newserial'
WHERE serial='&p_oldserial';
如果这可能是一个频繁的更改,并且您无法添加代理键,请查看级联选项。您的问题是“我的脚本中是否有错误?”
答案是“是的,非常肯定”,但可能不是你想的那样。这不是一个语法错误,很容易修复。这是一个逻辑和理解的问题,要处理起来要困难得多
主键有三个基本属性: