mysql Неправильно сформировано ограничение внешнего ключа - PullRequest
131 голосов
/ 08 декабря 2011

У меня есть две таблицы, table1 - это родительская таблица со столбцом ID и table2 со столбцом IDFromTable1 (не фактическое имя), когда я ставлю FK на IDFromTable1 до IDв table1 я получаю ошибку Foreign key constraint is incorrectly formed error.Я хотел бы удалить запись таблицы 2, если table1 запись будет удалена.Спасибо за любую помощь

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;

Дайте мне знать, нужна ли какая-либо другая информация.Я новичок в MySQL

Ответы [ 26 ]

1 голос
/ 08 декабря 2011

Попробуйте выполнить следующее:

show create table Parent

//and check if type for both tables are the same, like myISAM or innoDB, etc
//Other aspects to check with this error message: the columns used as foreign 
keys must be indexed, they must be of the same type 
(if i.e one is of type smallint(5) and the other of type smallint(6), 
it won't work), and, if they are integers, they should be unsigned.

//or check for charsets
show variables like "character_set_database";
show variables like "collation_database";

//edited: try something like this
ALTER TABLE table2
ADD CONSTRAINT fk_IdTable2
FOREIGN KEY (Table1_Id)
REFERENCES Table1(Table1_Id)
ON UPDATE CASCADE 
ON DELETE CASCADE;
0 голосов
/ 15 июля 2019

Я столкнулся с той же проблемой только сейчас.В моем случае все, что мне нужно было сделать, это убедиться, что таблица, на которую я ссылаюсь во внешнем ключе, должна быть создана до текущей таблицы (ранее в коде).Поэтому, если вы ссылаетесь на переменную (x * 5), система должна знать, что такое x (x должен быть объявлен в более ранних строках кода).Это решило мою проблему, надеюсь, это поможет кому-то еще.

0 голосов
/ 01 декабря 2015

У меня была та же проблема с построителем схем миграции Laravel 5.1 с MariaDB 10.1.

Проблема заключалась в том, что я набрал unigned вместо unsigned (буква s отсутствовала) при настройкестолбец.

После исправления опечатка была исправлена ​​для меня.

0 голосов
/ 15 ноября 2017

Даже я столкнулся с той же проблемой с mysql и liquibase.Так вот в чем проблема: таблица, из которой вы хотите сослаться на столбец другой таблицы, отличается либо в случае типа данных, либо с точки зрения размера типа данных.

Error appears in below scenario:
Scenario 1:
Table A has column id, type=bigint
Table B column referenced_id type varchar(this column gets the value from the id column of Table A.)
Liquibase changeset for table B:

    <changeset id="XXXXXXXXXXX-1" author="xyz">
            <column name="referenced_id" **type="varchar"**>
        </column>
            </changeset>
    <changeSet id="XXXXXXXXXXX-2" author="xyz">
                <addForeignKeyConstraint constraintName="FK_table_A"
                    referencedTableName="A" **baseColumnNames="referenced_id**"
                    referencedColumnNames="id" baseTableName="B" />
    </changeSet>

Table A changeSet:

    <changeSet id="YYYYYYYYYY" author="xyz">
     <column **name="id"** **type="bigint"** autoIncrement="${autoIncrement}">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
    </changeSet>

Solution: 
correct the type of table B to bigint because the referenced table has type bigint.

Scenrario 2:
The type might be correct but the size might not.
e.g. :
Table B : referenced column type="varchar 50"
Table A : base column type ="varchar 255"

Solution change the size of referenced column to that of base table's column size.
0 голосов
/ 07 апреля 2018

Или вы можете использовать DBDesigner4 с графическим интерфейсом для создания базы данных и связывания их с помощью FK. Щелкните правой кнопкой мыши на своей таблице и выберите «Копировать таблицу SQL Create», которая создает код.

enter image description here

0 голосов
/ 19 февраля 2018

Убедитесь, что вы указали имя таблицы в правильном регистре (если имена таблиц чувствительны к регистру в вашей базе данных). В моем случае я должен был изменить

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

до

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `CUSTOMER` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

обратите внимание, что customer изменено на CUSTOMER.

...