MySQL给了我这个错误:
错误代码:#1822 - 无法添加外键约束。缺少约束索引''在引用的表格' produtos'
中
这是我的数据库:
-- phpMyAdmin SQL Dump
-- version 4.7.7
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Generation Time: 10-Jun-2018 às 22:31
-- Versão do servidor: 5.6.39
-- PHP Version: 5.6.30
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
--
--
-- --------------------------------------------------------
--
-- Estrutura da tabela `fornecedores`
--
CREATE TABLE `fornecedores` (
`Id_Forn` int(9) NOT NULL,
`Nome` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`Empresa` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`Descrição` mediumtext COLLATE utf8_unicode_ci NOT NULL,
`Contacto` int(9) NOT NULL,
`Referencia` int(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Estrutura da tabela `funcionários`
--
CREATE TABLE `funcionários` (
`ID_Func` int(9) NOT NULL,
`First_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`Last_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`Email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`User` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`PassWord` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`Contacto` int(9) NOT NULL,
`NIF` int(9) NOT NULL,
`Morada` mediumtext COLLATE utf8_unicode_ci NOT NULL,
`Vencimento` int(9) NOT NULL,
`Cargo` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT;
--
-- Extraindo dados da tabela `funcionários`
--
-- --------------------------------------------------------
--
-- Estrutura da tabela `newsletter`
--
CREATE TABLE `newsletter` (
`Email` varchar(100) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Estrutura da tabela `produtos`
--
CREATE TABLE `produtos` (
`Referencia` int(20) NOT NULL,
`Tipo` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`Nome` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`Descricao` varchar(10000) COLLATE utf8_unicode_ci NOT NULL,
`Imagens` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`Stock` int(3) NOT NULL,
`Numero_Serie` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`Preco` int(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Extraindo dados da tabela `produtos`
--
-- --------------------------------------------------------
--
-- Estrutura da tabela `utilizadores`
--
CREATE TABLE `utilizadores` (
`ID_Uti` int(9) NOT NULL,
`First_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`Las_name` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`Email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Contacto` int(9) NOT NULL,
`PassWord` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`Newsletter` int(1) DEFAULT NULL,
`Morada` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
`Codigo_Postal` varchar(8) COLLATE utf8_unicode_ci DEFAULT NULL,
`Conselho` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`NIF` int(9) DEFAULT NULL,
`Ativo` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Extraindo dados da tabela `utilizadores`
--
-- --------------------------------------------------------
--
-- Estrutura da tabela `vendas`
--
CREATE TABLE `vendas` (
`ID_Vendas` int(9) NOT NULL,
`ID_Uti` int(9) NOT NULL,
`Referencia` int(20) NOT NULL,
`Data` date NOT NULL,
`Estado` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `fornecedores`
--
ALTER TABLE `fornecedores`
ADD PRIMARY KEY (`Id_Forn`),
ADD UNIQUE KEY `Contacto` (`Contacto`),
ADD UNIQUE KEY `Referencia` (`Referencia`),
ADD FOREIGN KEY (`Referencia`) REFERENCES `produtos` (`Referencia`) ;
--
-- Indexes for table `funcionários`
--
ALTER TABLE `funcionários`
ADD PRIMARY KEY (`ID_Func`),
ADD UNIQUE KEY `Email` (`Email`),
ADD UNIQUE KEY `Contacto` (`Contacto`);
--
-- Indexes for table `newsletter`
--
ALTER TABLE `newsletter`
ADD PRIMARY KEY (`Email`);
--
-- Indexes for table `produtos`
--
ALTER TABLE `produtos`
ADD PRIMARY KEY (`Referencia`),
ADD UNIQUE KEY `Nome` (`Nome`);
--
-- Indexes for table `utilizadores`
--
ALTER TABLE `utilizadores`
ADD PRIMARY KEY (`ID_Uti`),
ADD UNIQUE KEY `Email` (`Email`);
--
-- Indexes for table `vendas`
--
ALTER TABLE `vendas`
ADD PRIMARY KEY (`ID_Vendas`),
ADD UNIQUE KEY `ID_Uti` (`ID_Uti`),
ADD UNIQUE KEY `Referencia` (`Referencia`),
ADD FOREIGN KEY (`ID_Uti`) REFERENCES `utilizadores` (`ID_Uti`),
ADD FOREIGN KEY (`Referencia`) REFERENCES `produtos` (`Referencia`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `fornecedores`
--
ALTER TABLE `fornecedores`
MODIFY `Id_Forn` int(9) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `funcionários`
--
ALTER TABLE `funcionários`
MODIFY `ID_Func` int(9) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15582;
--
-- AUTO_INCREMENT for table `produtos`
--
ALTER TABLE `produtos`
MODIFY `Referencia` int(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=96455;
--
-- AUTO_INCREMENT for table `vendas`
--
ALTER TABLE `vendas`
MODIFY `ID_Vendas` int(9) NOT NULL AUTO_INCREMENT;
COMMIT;
我无法理解错误的位置。
答案 0 :(得分:2)
外键需要指向主键或唯一约束。但是,当引用的列不是(仍)主键时,您正在使用的脚本会尝试创建外键。
请参阅下面的错误?
ALTER TABLE `fornecedores`
ADD PRIMARY KEY (`Id_Forn`),
ADD UNIQUE KEY `Contacto` (`Contacto`),
ADD UNIQUE KEY `Referencia` (`Referencia`),
ADD FOREIGN KEY (`Referencia`) REFERENCES `produtos` (`Referencia`) ;
此时,Referencia
列尚未成为produtos
上的主键。它在您的脚本中成为主键稍后。
解决方案?只需重新排列脚本即可先创建所有主键,然后再创建外键。容易。