Mysql重复外键约束

ana*_*tak 6 mysql

当我尝试导入数据库时​​出现此错误

SQL query:
ALTER TABLE `bid`
ADD CONSTRAINT `bid_ibfk_4` FOREIGN KEY (`auction_contact_id`) REFERENCES `auction_contact` (`auction_contact_id`),
ADD CONSTRAINT `bid_ibfk_3` FOREIGN KEY (`car_id`) REFERENCES `car` (`car_id`)

MySQL said: Documentation
#1826 - Duplicate foreign key constraint name 'projekt_classics/bid_ibfk_3'
Run Code Online (Sandbox Code Playgroud)

查看所有外键,我得到了这个结果

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE = 'FOREIGN KEY' 
Run Code Online (Sandbox Code Playgroud)

结果

def     projekt_classics    bid_ibfk_2      projekt_classics    bid     FOREIGN KEY
def     projekt_classics    bid_ibfk_3      projekt_classics    bid     FOREIGN KEY
def     projekt_classics    car_ibfk_1      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_ibfk_3      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_ibfk_4      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_brand_ibfk_1    projekt_classics    car_brand   FOREIGN KEY
Run Code Online (Sandbox Code Playgroud)

搜索 sqlbid_ibfk_3约束只显示 1 次。所有数据都在导入的数据库中,但我想知道如何避免此错误。

编辑: 首先删除所有表运行查询没有问题。我使用 PHPmyadmin 导出我的数据库。我猜这个错误是因为在尝试再次创建之前尚未删除外键约束。

Kae*_*aeL 5

如果查看查询结果,则外键bid_ibfk_3 已经存在。实际上它在结果的第二行。

def     projekt_classics    bid_ibfk_2      projekt_classics    bid     FOREIGN KEY
--the row below is the foreign key that you are trying to create
def     projekt_classics    bid_ibfk_3      projekt_classics    bid     FOREIGN KEY
def     projekt_classics    car_ibfk_1      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_ibfk_3      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_ibfk_4      projekt_classics    car     FOREIGN KEY
def     projekt_classics    car_brand_ibfk_1    projekt_classics    car_brand   FOREIGN KEY
Run Code Online (Sandbox Code Playgroud)

这就是为什么当您尝试执行此操作时会获得重复的外键约束名称的原因:

ADD CONSTRAINT `bid_ibfk_3` FOREIGN KEY (`car_id`) REFERENCES `car` (`car_id`)
Run Code Online (Sandbox Code Playgroud)

您可以修改您的查询以在实际创建之前先检查您尝试创建的外键是否不存在。

IF NOT EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                   WHERE CONSTRAINT_SCHEMA = DATABASE()
                         AND CONSTRAINT_TYPE = 'FOREIGN KEY'
                         AND CONSTRAINT_NAME = 'bid_ibfk_3') THEN
   ALTER TABLE `bid` ADD CONSTRAINT `bid_ibfk_3`
        FOREIGN KEY (`car_id`) REFERENCES `car` (`car_id`);
END IF
Run Code Online (Sandbox Code Playgroud)

  • 或者,只需删除可选关键字`CONSTRAINT` 和它后面的符号/标识符,并且只需`ADD FOREIGN KEY ...`,因为InnoDB 会自动为每个符号生成唯一的符号。(+1) (4认同)