2017-06-03 57 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; 

然後運行

ALTER TABLE Persons 
DROP CONSTRAINT <pk constraint>; 
0

不要以爲你能做到在1個SQL命令,不知道約束的名字,但你可以知道在這種情況下約束名稱將由系統定義。一些以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

其實它可以在一個語句來完成。看到我的答案。 – APC