This is a very common error when create a mysql table , even some people has take it as a mysql bug and commit it to the official , I came up with this bothered problem these days also, after a crazy Google work, the source of the problem became clear , the following lines is a very good article that give that "bug" a conclusion , and I'd like to translate it into simple Chinese in case you'll hit that problem again ,
Concerning the personal talent, some mistakes can not be avoid , if you found any, please feel free to contact me , or leave a message below, thanks in advance.
source url :
http://www.verysimple.com/blog/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
Translation text :
当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。
在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序,已知的原因:
1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和 unsigned 的信息,请参阅:http://www.verysimple.com/blog/?p=57
2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。
3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。
4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型
5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug.
6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致
7, 你可能设置为外键设置了一个默认值,如 default=0
8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。
9, ALTER 声明中有语法错误
分享到:
相关推荐
RAISE_APPLICATION_ERROR(-20000, 'Can''t find table, please check input!'); ELSE Result := 'CREATE TABLE `' || LOWER(i_table_name) || '` ('; -- 遍历所有列 FOR c IN ( SELECT a.column_name, a....
语法:bool mysql_data_seek(int result, int row_number); 6. mysql_db_query 函数 mysql_db_query 函数用于发送查询字符串到 MySQL 数据库。该函数返回的是资源类型,表示查询结果。如果查询成功,则返回查询...
create table abc (number int, name char(15)); ``` - **查看表结构**: ```sql desc abc; ``` 或者 ```sql describe abc; ``` - **删除表**: ```sql drop table abc; ``` - **插入数据**: ```sql ...
public function create_database($data=''){$this->query("CREATE DATABASE {$data}");} // 查询服务器所有数据库 public function show_database(){ $this->query('SHOW DATABASES'); $db=array(); while...
创建表可以使用`CREATE TABLE`语句,它允许定义表名和列,每列都有指定的数据类型,如数值型、日期时间型、字符串型等。 SQL基本操作还包括数据操作,即对数据进行增加、查询、更新和删除(CRUD)操作。数据插入...
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, password VARCHAR(64) NOT NULL, email VARCHAR(128) NOT NULL, age TINYINT UNSIGNED NOT NULL ); ``` 插入数据时,...
= Client.ERROR_DB_CREATE_EXISTS) { throw err; } }); ``` 在数据库创建后,切换到该数据库: ```javascript client.query('USE '+TEST_DATABASE); ``` 接着,我们创建一个名为`test`的表,并定义其字段: ``...
The specific example is parsing a MySQL error log file, organizing the data into unique dates and error messages, and counting the number of times each error message appeared on each date. The ...
If PHP can't find an expected ; directive because it is not set or is mistyped, a default value will be used. ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one ; of the...
sql.execute("CREATE TABLE student (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL DEFAULT 'name', math INT NOT NULL DEFAULT 60, PRIMARY KEY (id))"); ``` 2. **插入数据** - 同样使用`...
goroutines, by talking about how you can create goroutines and how you can synchronize them and wait for them to finish before ending a program. Then it talks about channels and pipelines, which help ...
1. Create table命令 用于创建表。在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等 语法结构 create table 表名( [字段名] [类型] [约束] ……….. CONSTRAINT fk_column FOREIGN KEY(column1...
CREATE TABLE new_employees AS SELECT * FROM employees; ``` ### 6. Oracle 的分页功能 Oracle 数据库提供了一种简单的方法来实现分页查询,即使用 ROWNUM 函数。 **示例:** 获取第 11 到第 20 条记录: ```...
pCommand->CommandText = "CREATE TABLE MyTable (ID INT, Name VARCHAR(255));"; pCommand->Execute(NULL, NULL, ADODB::adCmdText); ``` 4. 查询数据: - 创建Recordset对象,通过Command对象的Execute方法...
When you click on a table, it lists all <END><br>38,3a.zip An Inventory System, you can add, edit, sort, find, delete, print, change your password and create a backup of your database<END><br>39,A...
CREATE TABLE stuinfo ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), gender VARCHAR(10), age INT, major VARCHAR(50), contact VARCHAR(100), hobby VARCHAR(100) ); ``` 3. **创建信息收集...
* TClientDataSet doesn‘t save data to file when FileName is set and there is no existing file on disk (Quality Central 2307). * Using the Delphi 7 version of midas.dll to open an XML file that was ...