#1822 - 无法添加外键约束

时间:2018-06-10 22:13:02

标签: mysql

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;

我无法理解错误的位置。

1 个答案:

答案 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上的主键。它在您的脚本中成为主键稍后

解决方案?只需重新排列脚本即可先创建所有主键,然后再创建外键。容易。

相关问题