2011-02-23 46 views
31

我正在學習SQL,讓我困擾的是,我似乎無法在表上找到所有約束。我創建的表MySQL:如何查看錶上的所有約束?

create table t2 
(a integer not null primary key, 
b integer not null, constraint c1 check(b>0), 
constraint fk1 foreign key(a) references t1(a)); 

,並增加了約束與

alter table t2 
add constraint c2 check (b<20); 

那我就看到

show table status 
from tenn #-->the name of my database 
like 't2'; 

然後

show create table t2; 
全部(4個)的限制

然後

select * 
from information_schema.key_column_usage 
where table_name='t2'; 

最後

select * 
from information_schema.table_constraints 
where table_name='t2'; 

但是,這些節目全部四個約束。誰能告訴我如何看到他們所有人?

非常感謝!

+1

能否請你說明什麼是您運行查詢的結果? * P.S我聽說的是,mysql不支持檢查約束。 – user194076

+0

雖然你試過CONSTRAINT_COLUMN_USAGE? – user194076

+0

您可以嘗試直接查詢系統表,而不是信息架構視圖 – user194076

回答

18

MySQL不支持檢查約束。 SQL被解析,接受,然後在沒有任何消息給用戶的情況下被默認忽略。

由於未創建檢查約束,您將不會看到它。

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'; 
3

外鍵約束從以下命令的輸出的註釋列中列出

select 
    table_name,column_name,referenced_table_name,referenced_column_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 

還是爲了更好的格式化輸出使用這樣的:

select 
    concat(table_name, '.', column_name) as 'foreign key', 
    concat(referenced_table_name, '.', referenced_column_name) as 'references' 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 
+0

這並沒有爲我工作(MySQL的5.5.35-0ubuntu0.12.04.2):註釋字段爲空,而RR馬達夫的解決方案顯示限制返回列。 – msanford

10

您可以使用此:

45
select COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_COLUMN_NAME, REFERENCED_TABLE_NAME 
from information_schema.KEY_COLUMN_USAGE 
where TABLE_NAME = 'table to be checked'; 
+0

一個不錯的,乾淨的,最小的解決方案。 –

3

你可以使用一個選擇information_schema.table_constraints這樣的:

mysql> select * from information_schema.table_constraints 
-> where table_schema = schema() 
-> and table_name = 'table_name'; 
0

出口在SQL數據庫表。

如果你有phpmyadmin,你可以通過訪問「Export」選項卡來完成。如果選擇「自定義」導出方法,請務必在「格式特定的選項」部分下選擇「結構」或「結構和數據」。

樣品.SQL出口段:

-- 
-- Table structure for table `customers` 
--  

CREATE TABLE `customers` (
    `username` varchar(50) NOT NULL, 
    `fullname` varchar(100) NOT NULL, 
    `postalcode` varchar(50) NOT NULL, 
    PRIMARY KEY (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
... 
13

最簡單的方法,看看當前表的解釋和它的約束是使用:

SHOW CREATE TABLE mytable;

這將顯示你到底是什麼SQL將被輸入以定義當前表格的表格結構。

1

不幸的是,MySQL不支持SQL檢查約束。當你在查詢中定義它們時,它們會被忽略。