Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更改主键但获取错误_Sql_Oracle_Plsql - Fatal编程技术网

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';
如果这可能是一个频繁的更改,并且您无法添加代理键,请查看级联选项。

您的问题是“我的脚本中是否有错误?”

答案是“是的,非常肯定”,但可能不是你想的那样。这不是一个语法错误,很容易修复。这是一个逻辑和理解的问题,要处理起来要困难得多

主键有三个基本属性:

  • 它是独一无二的
  • 它不是空的
  • 这是不变的
  • 你试图违反规则3。现在,在所有其他条件相同的情况下,Oracle(以及我曾经使用过的所有其他关系数据库)将允许您随意违反规则3。但是,在本例中,还有另一个带有外键约束的表,它引用了您试图更改的主键。UPDATE语句执行后,Oracle检查所有可能受影响的外键约束,并发现其中一个约束已被违反,因为“child”表上的键值不再存在于“parent”表(本例中为SALEINV表)中

    此时,一个常见的反应是:“愚蠢的数据库!关系数据库显然坏了!我聪明多了!!外键约束不好,必须消除!!!”。于是开发商气愤地走下悬崖,疯狂地删除外键,想知道为什么会有这么大的风。我是说,怎么了

    事实上,外键约束让你免于做一些非常非常糟糕的事情——非常糟糕,事实上,它看起来非常非常好,但不,老实说,从我这里说,更改主键是一件非常糟糕的事情。(不要问我怎么知道…:-)。主键是唯一一个让你知道有问题的行永远是同一个东西的东西,如果你改变它,你会说“这个以前是ABC的东西现在是XYZ,它所指的任何地方现在都必须是XYZ”。可以将其视为数据库中的“人体掠夺者入侵”——一旦开始这样做,您就无法再相信任何东西都会保持原样,您无法安全地将任何行与任何其他行关联,因为键可能会更改,您无法强制执行关系完整性,而且,当你开始处理所有“丢失的记录”、“丢失的父记录”、“丢失的数据”和相关问题时,你的生活会变得非常有趣

    最后的分析-想出一些其他的方法来做你想做的事情。除此之外,你真的是在暗示你在改变车辆的VIN吗?这是另一件坏事,我怀疑有很多执法机构愿意解释为什么…:-)

    分享和享受。

    你的问题是“我的脚本有没有出错?”

    答案是“是的,非常肯定”,但可能不是你想的那样。这不是一个语法错误,很容易修复。这是一个逻辑和理解的问题,要处理起来要困难得多

    主键有三个基本属性:

  • 它是独一无二的
  • 它不是空的
  • 这是不变的
  • 你试图违反规则3。现在,在所有其他条件相同的情况下,Oracle(以及我曾经使用过的所有其他关系数据库)将允许您随意违反规则3。但是,在本例中,还有另一个带有外键约束的表,它引用了您试图更改的主键。UPDATE语句执行后,Oracle检查所有可能受影响的外键约束,并发现其中一个约束已被违反,因为“child”表上的键值不再存在于“parent”表(本例中为SALEINV表)中

    此时,一个常见的反应是:“愚蠢的数据库!关系数据库显然坏了!我聪明多了!!外键约束不好,必须消除!!!”。于是开发商气愤地走下悬崖,疯狂地删除外键,想知道为什么会有这么大的风。我是说,怎么了

    事实上,外键约束让你免于做一些非常非常糟糕的事情——非常糟糕,事实上,它看起来非常非常好,但不,老实说,从我这里说,更改主键是一件非常糟糕的事情。(不要问我怎么知道…:-)。主键是唯一一个让您知道所讨论的行始终是和for的东西