2012-03-30 29 views
7

Tôi có bảng này:MySQL: # 1005 - Không thể tạo bảng (errno: 150) Khi tôi cố gắng tạo ra hơn 1 FK

CREATE TABLE IF NOT EXISTS `produtos` (
    `id` int(11) NOT NULL auto_increment, 
    `idcatprodutos` int(11) NOT NULL, 
    `idcategoria` int(11) NOT NULL, 
    `idmarca` int(11) NOT NULL, 
    `nome` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_produtos_2` (`idcatprodutos`), 
    KEY `FK_produtos_3` (`idmarca`), 
    KEY `FK_produtos_4` (`idcategoria`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=39 ; 

và bảng này:

CREATE TABLE IF NOT EXISTS `sugestoes` (
    `id` int(11) NOT NULL auto_increment, 
    `idproduto` int(11) NOT NULL, 
    `idsugestao1` int(11) NOT NULL, 
    `idsugestao2` int(11) NOT NULL, 
    `idsugestao3` int(11) NOT NULL, 
    `idsugestao4` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_sugestoes_prod` (`idproduto`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED AUTO_INCREMENT=9 ; 

Tôi đã tạo ra một fk sugestoes.idproduto -> produtos.id làm việc, nhưng tôi muốn mỗi lĩnh vực khác cũng tham khảo các produtos.id thông qua FK mới. Chạy lệnh dưới đây mà trở lại MySQL Lỗi: # 1005 - Không thể tạo bảng (errno: 150):

ALTER TABLE `infantile`.`sugestoes` ADD CONSTRAINT `FK_sugestoes_2` FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`) 
    REFERENCES `produtos` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ROW_FORMAT = FIXED; 

Có ai có bất kỳ ý tưởng gì đang xảy ra?

+0

Tại sao bạn thêm ', ROW_FORMAT = FIXED' vào trong' ALTER TABLE'? –

Trả lời

10

Hãy thử điều này,

nó hoạt động:

ALTER TABLE `sugestoes` 
ADD CONSTRAINT `FK_idproduto_produtos_1` FOREIGN KEY (`idproduto`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_2` FOREIGN KEY (`idsugestao1`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_3` FOREIGN KEY (`idsugestao2`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_4` FOREIGN KEY (`idsugestao3`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_5` FOREIGN KEY (`idsugestao4`) REFERENCES `produtos` (`id`) 

UPDATE:

Bạn có thể không xác định

ON DELETE SET NULL 

Bởi vì điều này:

Bạn đã xác định một điều kiện SET NULL mặc dù một số trong những cột được định nghĩa là NOT NULL

Bạn có thể thấy lỗi chính xác khi bạn chạy

SHOW ENGINE INNODB STATUS; 
+1

Tác phẩm dài hơn không giải quyết được vấn đề của tôi, Tôi cần ON DELETE SET NULL và SET OnUpdate Cascade, khi tôi cố thực hiện những thay đổi này, đưa ra thông báo lỗi tương tự. – user1068478

+2

Xem câu trả lời cập nhật của tôi – rkosegi

+0

Tôi cần khi người dùng XÓA một số produto.idproduto sugestao.idsugestao tương ứng là rỗng hoặc trống, làm cách nào tôi có thể đặt nó? – user1068478

0

lẽ tháo ROW_FORMAT = FIXED:

ALTER TABLE `infantile`.`sugestoes` 
    ADD CONSTRAINT `FK_sugestoes_2` 
    FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`) 
     REFERENCES `produtos` (`id`) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
; 

On suy nghĩ thứ hai, làm thế nào để bạn mong đợi các ON DELETE SET NULL để hành xử khi cột của bạn được xác định với NOT NULL?


Và thứ ba, bảng có chứa dữ liệu nào không? Nếu một số hàng vi phạm ràng buộc FK này, thì bạn không thể tạo ra FK đó.

Các vấn đề liên quan