2017-06-03 19 views

答えて

3

"定義された制約が存在しないとしてPKを削除するには?"

実際に、それはあなたが願うかもしれないとしてすべてのビットのように簡単です:

SQL> create table t23 (id number primary key); 

Table created. 

SQL> select constraint_name, constraint_type 
    2 from user_constraints 
    3 where table_name = 'T23' 
    4/

CONSTRAINT_NAME    C 
------------------------------ - 
SYS_C0034419     P 

SQL> alter table t23 drop primary key; 

Table altered. 

SQL> select constraint_name, constraint_type 
    2 from user_constraints 
    3 where table_name = 'T23' 
    4/

no rows selected 

SQL> 
0

実行この制約名を取得するには:その後、

SELECT * 
    FROM user_cons_columns 
WHERE table_name = Persons; 

あなたが制約名を知らなくても、1つのSQLコマンドでそれを行うことができるとは思わないが、あなたが知っていることができ

ALTER TABLE Persons 
DROP CONSTRAINT <pk constraint>; 
0

を実行しますこの場合の制約名はシステムによって定義されます。 SYS....で始まるもの。

また、PLSQLブロックを使用して同じ結果を得ることもできます。

あなたのケースについては下記の例をご覧ください。

CREATE TABLE Persons (
ID int PRIMARY KEY, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Age int 
); 

制約名を探す

select CONSTRAINT_NAME 
From USER_CONSTRAINTS 
where table_name='PERSONS' 
AND CONSTRAINT_TYPE='P'; 

OUTPUT:= SYS_C0012152

ドロップ制約

ALTER TABLE PERSONS 
DROP CONSTRAINT SYS_C0012152; 

注:制約名SYS_C0012152は、単一引用符で囲まれていません。

PLSQLブロックを行うには、同じ

declare 
sql_stmt varchar2(255); 
cons_name varchar2(30); 
begin 
    select CONSTRAINT_NAME 
    into cons_name 
    From USER_CONSTRAINTS 
    where table_name='PERSONS' 
    AND CONSTRAINT_TYPE='P'; 

    sql_stmt:=' ALTER TABLE PERSONS 
    DROP CONSTRAINT '||cons_name; 

    dbms_output.put_line(sql_stmt); 
    execute immediate sql_stmt; 

end; 
+0

実際には1つのステートメントで行うことができます。私の答えを見てください。 – APC

関連する問題