2010-12-28 13 views
4

SHOW CREATE TABLEは私が期待しているように外部キー制約を表示していません。実証するためにSHOW CREATE TABLEの出力に外部キーの制約がありません

、ここMySQL manualからの例です:

CREATE TABLE parent (
    id INT NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=INNODB; 
CREATE TABLE child (
    id INT, parent_id INT, 
    INDEX par_ind (parent_id), 
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE 
) ENGINE=INNODB; 

mysql> SHOW CREATE TABLE child\G 
*************************** 1. row *************************** 
     Table: child 
Create Table: CREATE TABLE "child" (
    "id" int(11) default NULL, 
    "parent_id" int(11) default NULL, 
    KEY "par_ind" ("parent_id") 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

その出力では、私のようなものを参照すると予想しているでしょう:その作成テーブル出力に

CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) 
REFERENCES `parent` (`id`) ON DELETE CASCADE 

をしかしはっきりそれはありません。

制約は、しかし、存在するように見えるん:

mysql> SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema=database()\G 
*************************** 1. row *************************** 
      CONSTRAINT_CATALOG: NULL 
      CONSTRAINT_SCHEMA: test_fk 
       CONSTRAINT_NAME: child_ibfk_1 
       TABLE_CATALOG: NULL 
       TABLE_SCHEMA: test_fk 
        TABLE_NAME: child 
        COLUMN_NAME: parent_id 
      ORDINAL_POSITION: 1 
POSITION_IN_UNIQUE_CONSTRAINT: 1 
     REFERENCED_TABLE_SCHEMA: test_fk 
     REFERENCED_TABLE_NAME: parent 
     REFERENCED_COLUMN_NAME: id 
*************************** 2. row *************************** 
      CONSTRAINT_CATALOG: NULL 
      CONSTRAINT_SCHEMA: test_fk 
       CONSTRAINT_NAME: PRIMARY 
       TABLE_CATALOG: NULL 
       TABLE_SCHEMA: test_fk 
        TABLE_NAME: parent 
        COLUMN_NAME: id 
      ORDINAL_POSITION: 1 
POSITION_IN_UNIQUE_CONSTRAINT: NULL 
     REFERENCED_TABLE_SCHEMA: NULL 
     REFERENCED_TABLE_NAME: NULL 
     REFERENCED_COLUMN_NAME: NULL 
2 rows in set (0.01 sec) 

mysql> SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE table_schema=database()\G 
*************************** 1. row *************************** 
CONSTRAINT_CATALOG: NULL 
CONSTRAINT_SCHEMA: test_fk 
    CONSTRAINT_NAME: child_ibfk_1 
     TABLE_SCHEMA: test_fk 
     TABLE_NAME: child 
    CONSTRAINT_TYPE: FOREIGN KEY 
*************************** 2. row *************************** 
CONSTRAINT_CATALOG: NULL 
CONSTRAINT_SCHEMA: test_fk 
    CONSTRAINT_NAME: PRIMARY 
     TABLE_SCHEMA: test_fk 
     TABLE_NAME: parent 
    CONSTRAINT_TYPE: PRIMARY KEY 
2 rows in set (0.01 sec) 

は、私は自分のデザインの例と同じ結果を得ます。

何が起こっているのでしょうか?


UPDATE 2011-01-08:私は、これはsql_modeの変数とは何かを持っていると思います。しかし、現時点では、SHOW CREATE TABLE出力からどのモード設定で制約を除外するのか分かりません。

+0

制約は私にはOKを示します。どのMySQLバージョンを使用していますか?テーブルを作成するときにエラーが発生していませんか? – Quassnoi

答えて

0

残念ながら、私はしたいと思うように私はコメントすることはできませんので、あなたの質問に弱い答えが聞こえます。 。 。

このコマンドは機能します。テーブルを作成するときに: 制約と名前/ IDで外部キーを実装しようとすると!制約 'child_fk1' FOREIGN KEY ( 'PARENT_ID')REFERENCES親( 'ID')

が役立つかもしれ

、そうでない場合は、サーバーのバージョンにcorrspondingオンラインオラクルのMySQLの構文をチェック!

http://dev.mysql.com/doc/refman/5.0/en/create-table.html よろしく

+0

emanindは最初にテーブルを作成するときにconstarintを正しく設定します! –

1

MySQLのsql_modeの変数の設定は間違いなく私が報告行動の原因でした。私はmy.cnfから設定した行を削除し、mysqlは予期された動作を行いました。しかし、私はその設定が何だったのか忘れて、それ以来それを理解していません。もし誰が誰を特定できるのであれば、すぐに行きます。これを見つける人のため

0

、このクエリが役立ちます。

SELECT tb1.CONSTRAINT_NAME, tb1.TABLE_NAME, tb1.COLUMN_NAME, 
tb1.REFERENCED_TABLE_NAME, tb1.REFERENCED_COLUMN_NAME, tb2.MATCH_OPTION, 
tb2.UPDATE_RULE, tb2.DELETE_RULE 
FROM information_schema.`KEY_COLUMN_USAGE` AS tb1 
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS tb2 
ON tb1.CONSTRAINT_NAME = tb2.CONSTRAINT_NAME 
WHERE table_schema = '{DATABASE_NAME}' 
AND referenced_column_name IS NOT NULL 

もともとから撮影:here

は残念ながら「my.cnfの」中「sql_modeの」に変更し、出力には影響しませんでした

SHOW CREATE TABLE {TABLE_NAME}; 

「ON DELETE」の制限はまだありませんでした。 Mac OS X 10.9でMySQLバージョン5.6.22を使用しました。

関連する問題