我有两个表,table1是一个列ID的父表,table2是一个列IDFromTable1(不是实际的名称),当我把一个FK IDFromTable1到ID在table1,我得到的错误外键约束是不正确形成的错误。我想删除表2记录,如果表1记录被删除。谢谢你的帮助

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

如果还需要其他信息,请告诉我。我是mysql的新手


当前回答

谢谢S Doerin:

“只是为了完成。 如果你有一个VARCHAR(..)外键,并且被引用的表的字符集与引用它的表的字符集不同,也可能会出现这个错误。 例如,Latin1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同。

我解决了这个问题,改变了表格的字符类型。 创建的是latin1,正确的是utf8。

添加下一行。 默认字符集= utf8;

其他回答

我的情况是,我在参考栏上有一个错别字:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( coutry_code );
ERROR 1005 (HY000): Can't create table `blog`.`t_user` (errno: 150 "Foreign key constraint is incorrectly formed")

错误消息非常神秘,我已经尝试了所有的方法——验证列的类型、排序规则、引擎等。

我花了一段时间才注意到这个错字,修复后一切都很好:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( country_code );
Query OK, 2 rows affected (0.039 sec)              
Records: 2  Duplicates: 0  Warnings: 0

我在Laravel 5.1迁移Schema Builder到MariaDB 10.1时也遇到了同样的问题。

问题是我在设置列时输入了unsigned而不是unsigned(s字母不见了)。

修复后,错别字为我修复。

Mysql错误文本没有那么多的帮助,在我的情况下,列有“不空”约束,所以“删除设置空”是不允许的

我正在使用HeidiSQL,为了解决这个问题,我必须在引用表中创建一个索引,其中所有列都被引用。

甚至我在mysql和libase上也遇到了同样的问题。 这就是问题所在: 要引用其他表的列的表在数据类型或数据类型大小方面都不同。

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.