#1822-添加外键约束失败

bakd9h0s  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(395)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

两年前关门了。
改进这个问题
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;

我不明白错误在哪里。

5lhxktic

5lhxktic1#

外键需要指向主键或唯一约束。但是,当引用的列还不是主键时,您正在使用的脚本会尝试创建外键。
看到下面的错误了吗?

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 . 它在脚本的几行之后成为主键。
解决方案?只需重新排列脚本,首先创建所有主键,然后创建外键。容易的。

相关问题