2012-03-12 2 views
3

J'ai deux tables comme suit:MySQL: contrainte de clé étrangère ne sont pas appliquées

CREATE TABLE customer 
(
    id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(25), 
    PRIMARY KEY(id) 
); 

CREATE TABLE `client` 
(
    `id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200), 
    `customer_id` INT NOT NULL, 

    PRIMARY KEY(`id`), 
    INDEX(`customer_id`), 
    FOREIGN KEY (`customer_id`) REFERENCES `customer`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
); 

Puis je courais le suivant:

INSERT INTO customer (name) VALUES ('Customer1'); 

Maintenant, le client de la table contient le nom: Customer1, id: 1

Puis j'ai couru ceci:

INSERT INTO client (name, customer_id) VALUES ('Client of Customer1',34); 

Il était supposé échouer, mais il a été inséré avec succès. Pourquoi donc?

Ceci est sur MySQL 5.1 sur Linux Mint.

+1

Les deux tables sont-elles des tables InnoDB? –

+0

étrange. J'utilise 5.5.10 sous Windows et la contrainte a été appliquée. – Sekhar

+0

Comment puis-je vérifier s'ils sont InnoDB? –

Répondre

3

Effectuez un show create table customer. Il montrera le moteur utilisé à la fin de l'instruction create table. Si elles s'affichent en tant que MyISAM, ce moteur ne prend pas en charge les clés étrangères. Les définitions FK sont analysées, mais sinon ignorées.

Pour forcer une table être Inno DB, qui ne touches Foren de soutien, vous devez faire

CREATE TABLE (... blah blah blah ...) TYPE=InnoDB; 
             ^^^^^^^^^^^--force InnoDB type 
1

Peut-être un problème de moteur, juste pour être sûr ajouter le moteur lors de la création de tables:

CREATE TABLE customer 
(
    id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(25), 
    PRIMARY KEY(id) 
) ENGINE=INNODB; 

CREATE TABLE `client` 
(
    `id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200), 
    `customer_id` INT NOT NULL, 

    PRIMARY KEY(`id`), 
    INDEX(`customer_id`), 
    FOREIGN KEY (`customer_id`) REFERENCES `customer`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=INNODB; 
Questions connexes