[英]MySQL: #1005 - Can't create table (errno: 150)
我在用mysql向表中添加外键时遇到了一个小问题,我在下面的代码中找不到错误:
-- phpMyAdmin SQL Dump
-- version 4.1.12
-- http://www.phpmyadmin.net
--
-- Client : localhost
-- Généré le : Lun 09 Novembre 2015 à 23:43
-- Version du serveur : 5.5.36-MariaDB-log
-- Version de PHP : 5.5.11
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
--
-- Base de données : `morina`
--
-- --------------------------------------------------------
--
-- Structure de la table `Etat`
--
CREATE TABLE IF NOT EXISTS `Etat` (
`idetat` mediumint(8) NOT NULL AUTO_INCREMENT,
`nom` varchar(255) NOT NULL,
PRIMARY KEY (`idetat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Structure de la table `Facture`
--
CREATE TABLE IF NOT EXISTS `Facture` (
`idfacture` mediumint(8) NOT NULL AUTO_INCREMENT,
`idpaiement` mediumint(8) DEFAULT NULL,
`montant` int(11) DEFAULT NULL,
`jour` datetime NOT NULL,
PRIMARY KEY (`idfacture`),
KEY `idpaiement` (`idpaiement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Structure de la table `Paiement`
--
CREATE TABLE IF NOT EXISTS `Paiement` (
`idp` mediumint(8) NOT NULL AUTO_INCREMENT,
`intitule` varchar(255) NOT NULL,
PRIMARY KEY (`idp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Structure de la table `Rangee`
--
CREATE TABLE IF NOT EXISTS `Rangee` (
`idrangee` mediumint(8) NOT NULL AUTO_INCREMENT,
`zone` varchar(1) NOT NULL,
PRIMARY KEY (`idrangee`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Structure de la table `TableSalle`
--
CREATE TABLE IF NOT EXISTS `TableSalle` (
`idrangee` mediumint(8) NOT NULL,
`position` mediumint(8) NOT NULL,
`idetat` mediumint(8) NOT NULL,
PRIMARY KEY (`idrangee`,`position`),
KEY `idetat` (`idetat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Contraintes pour les tables exportées
--
--
-- Contraintes pour la table `Facture`
--
ALTER TABLE `Facture`
ADD CONSTRAINT `Facture_ibfk_1` FOREIGN KEY (`idpaiement`) REFERENCES `Paiement` (`idp`);
--
-- Contraintes pour la table `TableSalle`
--
ALTER TABLE `TableSalle`
ADD CONSTRAINT `TableSalle_ibfk_1` FOREIGN KEY (`idrangee`) REFERENCES `Rangee` (`idrangee`),
ADD CONSTRAINT `TableSalle_ibfk_2` FOREIGN KEY (`idetat`) REFERENCES `Etat` (`idetat`);
CREATE TABLE `AttributionTable` (
`idrangee` mediumint(8) NOT NULL,
`position` mediumint(8) NOT NULL,
`idfacture` mediumint(8) NOT NULL,
PRIMARY KEY (`idrangee`,`position`,`idfacture`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Contraintes pour la table `TableSalle`
--
ALTER TABLE `AttributionTable`
ADD CONSTRAINT `Attribution_ibfk_1` FOREIGN KEY (`idrangee`,`position`) REFERENCES `TableSalle`(`idrangee`,`position`),
--ADD CONSTRAINT `Attribution_ibfk_2` FOREIGN KEY (`position`) REFERENCES `TableSalle`(`position`),
ADD CONSTRAINT `Attribution_ibfk_3` FOREIGN KEY (`idfacture`) REFERENCES `Facture`(`idfacture`);
感谢帮助 ! :)
如果您重新创建一个被删除的表,它必须有一个符合引用它的外键约束的定义。 如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。 如果这些都不满足,MySQL 将返回 Error 1005 并在错误消息中引用 Error 150,这意味着未正确形成外键约束。 类似地,如果 ALTER TABLE 由于错误 150 而失败,这意味着对于更改后的表,外键定义的格式不正确。
在这里,您只需要创建带有附加索引position
表TableSalle
:
CREATE TABLE IF NOT EXISTS `TableSalle` (
`idrangee` mediumint(8) NOT NULL,
`position` mediumint(8) NOT NULL,
`idetat` mediumint(8) NOT NULL,
PRIMARY KEY (`idrangee`,`position`),
KEY `position` (`position`),
KEY `idetat` (`idetat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.