所以我有一張有 50 多行的表。目前該表中沒有任何主鍵/ID 列。現在,如果我必須添加一個主鍵列,它不允許我這樣做,因為表中已經存在資料,因此沒有唯一列或列組合。誰能建議我如何將主列添加到包含資料的現有表中。
uj5u.com熱心網友回復:
在您的情況下,當由于缺少 PK 定義而導致表遭受一些重復記錄時,您可以進行逐步恢復。
在第一步中,您禁用新重復行的創建。
讓我們假設你的PK候選人列是col1, col2如下面的例子:
CREATE TABLE test_pk as
SELECT 'A' col1, 1 col2 FROM dual UNION ALL
SELECT 'A' col1, 2 col2 FROM dual UNION ALL
SELECT 'B' col1, 1 col2 FROM dual UNION ALL
SELECT 'B' col1, 1 col2 FROM dual;
由于存在重復,您無法定義 PK
ALTER table test_pk ADD CONSTRAINT my_pk UNIQUE (col1, col2);
-- ORA-02299: cannot validate (xxx.MY_PK) - duplicate keys found
但是您可以在 PK 列上創建索引并在 state 中設定約束ENABLE NOVALIDATE。
這將容忍現有的重復,但拒絕新的一次。
CREATE INDEX my_pk_idx ON test_pk(col1, col2);
ALTER TABLE test_pk
ADD CONSTRAINT my_pk UNIQUE (col1,col2) USING INDEX my_pk_idx
ENABLE NOVALIDATE;
現在您可以插入新的唯一行...
INSERT INTO test_pk (col1, col2) VALUES ('A', 3);
-- OK
...但你不能創建新的重復:
INSERT INTO test_pk (col1, col2) VALUES ('A', 1);
-- ORA-00001: unique constraint (xxx.MY_PK) violated
稍后在第二步中,您可能會決定清理表和VALIDATE約束,這將按預期生成完美的主鍵:
-- cleanup
DELETE FROM TEST_PK
WHERE col1 = 'B' AND col2 = 1 AND rownum = 1;
ALTER TABLE test_pk MODIFY CONSTRAINT my_pk ENABLE VALIDATE;
uj5u.com熱心網友回復:
(從 121 開始。)您可以使用以下任一方法將新的自動遞增代理鍵添加到表中:
alter table t
add ( t_id integer generated by default as identity );
或者
create sequence s;
alter table t
add ( t_id integer default s.nextval );
這些設定所有現有行的值。所以在大桌子上可能需要一段時間!
不過,您還應該考慮在業務鍵上添加唯一約束。這樣做,采取 Marmite Bomber 建議的步驟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407683.html
標籤:
