0

これを使用してテーブルのプライマリを変更しようとしていますが、

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を取得しています。スクリプトに間違いがありますか?

4

2 に答える 2

1

最初の質問は、どのステートメントが失敗しているかです。スクリプトを一度に 1 ステートメントずつ実行します。DELETE ステートメントだと思います。

DELETE FROM customer
WHERE serial='&p_oldserial';

その場合、外部キーを使用してこの行を参照するすべてのレコードを移動していません。2 番目の更新を読む必要がありますか?

UPDATE serviceinv
SET    serial='&p_newserial'
WHERE  serial='&p_oldserial';

同様の更新が必要な他のテーブルはありますか?

他の人が指摘したように、主キーは一般に不変と見なされます。そのため、これは 1 回限りの変更である必要があります。これが頻繁に変更される可能性が高い場合は、代理キーが必要になることがあります。これにより、更新が次のように削減されます。

UPDATE car
SET    serial='&p_newserial'
WHERE  serial='&p_oldserial';

これが頻繁に変更される可能性が高く、代理キーを追加できない場合は、CASCADE オプションを調べてください。

于 2012-07-11T00:24:48.120 に答える