MySQL ERROR 1005 (HY000): Can't create table 'schema_name.table_name' (errno: 150)

本文介绍了一种在使用Yii框架创建包含外键的MySQL表时遇到的常见错误及其解决方案。通过运行特定的MySQL命令,可以获取详细的错误信息,帮助开发者快速定位并解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在按照书上的例子学习Yii的时候发现在创建一个有外键的MySQL表的时候总是报以下错误

ERROR 1005 (HY000): Can't create table '<schema>.<table>' (errno: 150)

但是仅仅从这个错误消息根本得不到任何对排查错误有意义的信息,找了一些文章大多数是说外键表和原表里声明的字段类型不一致,但是都没有给出怎么查出是这个错误的,后来发现原来可以通过运行"SHOW ENGINE INNODB STATUS;"命令,然后在命令结果中的“LATEST FOREIGN KEY ERROR”部分得到具体的错误消息。如下:

... mysql> SHOW ENGINE INNODB STATUS\G *************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 110920 23:26:39 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 19 seconds ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 46, signal count 46 Mutex spin waits 0, rounds 260, OS waits 13 RW-shared spins 58, OS waits 29; RW-excl spins 5, OS waits 4 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110920 23:26:33 Error in foreign key constraint of table trackstar_test/tbl_project_user_role: foreign key (`project_id`) references `tbl_project` (`id`) on delete cascade on update cascade ) engine InnoDB: Cannot resolve table name close to: (`id`) on delete cascade on update cascade ) engine InnoDB ------------ TRANSACTIONS ------------ Trx id counter 0 6375 Purge done for trx's n:o < 0 6353 undo n:o < 0 0 History list length 13 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 0, not started, process no 755, OS thread id 2991618928 MySQL thread id 42, query id 383 localhost root SHOW ENGINE INNODB STATUS -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (write thread) Pending normal aio reads: 0, aio writes: 0, ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 Pending flushes (fsync) log: 0; buffer pool: 0 36 OS file reads, 281 OS file writes, 177 OS fsyncs 0.00 reads/s, 0 avg bytes/read, 0.05 writes/s, 0.05 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2, 0 inserts, 0 merged recs, 0 merges Hash table size 34679, node heap has 1 buffer(s) 0.00 hash searches/s, 1.16 non-hash searches/s --- LOG --- Log sequence number 0 1774918 Log flushed up to 0 1774918 Last checkpoint at 0 1772796 0 pending log writes, 0 pending chkp writes 128 log i/o's done, 0.05 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 17596386; in additional pool allocated 960512 Dictionary memory allocated 58096 Buffer pool size 512 Free buffers 468 Database pages 43 Modified db pages 10 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 35, created 8, written 296 0.00 reads/s, 0.00 creates/s, 0.00 writes/s Buffer pool hit rate 1000 / 1000 -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 1 read views open inside InnoDB Main thread process no. 755, id 2955570032, state: sleeping Number of rows inserted 60, updated 0, deleted 0, read 159 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================


<think>好的,我现在要解决用户的问题,即如何使用SQL的group_concat函数从information_schema.schemata表中获取schema_name的连接字符串。首先,我需要回忆用户之前的问题和之前的回答,以保持连贯性。用户之前询问了关于PDO执行十六进制SQL的问题,现在转向SQL查询,特别是group_concat和information_schema的用法。 用户现在提到他们想理解group_concat和information_schema的作用,以及如何用group_concat从information_schema.schemata获取schema_name的连接字符串。首先,我需要确认用户是否已经了解这些基本概念,还是需要详细解释。 根据用户提供的引用内容,他们可能已经接触过一些例子,比如通过information_schema.tables获取表名,使用group_concat来合并结果。现在用户的问题是针对schemata表,获取schema_name,也就是数据库名称的连接字符串。 首先,我需要明确information_schema.schemata表的结构。根据MySQL文档,schemata表包含所有数据库的信息,其中schema_name列存储了数据库的名称。因此,正确的查询应该从schemata中选择schema_name,并用group_concat合并。 接下来,用户需要具体的SQL语句示例。根据引用中的例子,用户可能已经见过类似的结构,例如:SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'。现在需要将table_name替换为schema_name,并从schemata表中查询,而无需where条件,因为要获取所有数据库名称。 需要注意的是,如果用户使用的MySQL版本较高(8.0+),可能需要处理group_concat的默认长度限制,或者是否有权限访问information_schema。另外,用户可能想知道如何过滤结果,比如排除系统数据库,所以需要给出可选的where子句示例。 另外,用户可能对group_concat的参数感兴趣,比如使用SEPARATOR来改变分隔符,或者ORDER BY来排序结果。这些细节可以增强回答的实用性。 在安全方面,用户之前的回答中提到了PDO预处理语句,可能需要注意SQL注入的问题。但在这里,用户是在学习如何构造查询,而不是直接处理用户输入,所以可能不需要强调安全,但可以提到在生产环境中谨慎使用这类查询,尤其是在处理敏感信息时。 最后,用户的问题可能涉及到实际应用场景,比如数据库管理、数据导出或调试。因此,解释这些使用场景会帮助用户更好地理解何时使用这些技术。 总结步骤: 1. 解释information_schema.schemata表的作用。 2. 给出基础查询:SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata; 3. 讨论可能的过滤,如排除系统数据库。 4. 提到group_concat的参数,如分隔符和排序。 5. 提醒权限和长度限制的问题。 6. 提供示例输出,帮助用户理解结果。 需要确保回答准确,语法正确,并且符合用户的需求,即获取schema_name的连接字符串。同时,参考用户提供的引用,特别是引用1和引用2中的例子,保持回答的一致性。</think>### 使用`GROUP_CONCAT`函数从`information_schema.schemata`获取数据库名称列表 #### 1. **功能解析** - **`information_schema.schemata`表**:存储所有数据库的元数据,`schema_name`字段记录了数据库名称[^1]。 - **`GROUP_CONCAT`函数**:将多行数据合并为单个字符串,默认以逗号分隔,常用于简化结果展示[^3]。 #### 2. **基础查询语法** ```sql SELECT GROUP_CONCAT(schema_name) AS databases FROM information_schema.schemata; ``` - **输出示例**:`information_schema,mysql,performance_schema,security,sys`(所有数据库名称拼接的字符串) --- #### 3. **可选参数与过滤条件** - **指定分隔符**:通过`SEPARATOR`参数自定义分隔符号 ```sql SELECT GROUP_CONCAT(schema_name SEPARATOR ' | ') AS databases FROM information_schema.schemata; ``` 输出示例:`information_schema | mysql | performance_schema | security | sys` - **过滤系统数据库**:通过`WHERE`子句排除默认数据库 ```sql SELECT GROUP_CONCAT(schema_name) AS user_databases FROM information_schema.schemata WHERE schema_name NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys'); ``` - **排序与去重**:结合`ORDER BY`和`DISTINCT` ```sql SELECT GROUP_CONCAT(DISTINCT schema_name ORDER BY schema_name DESC) FROM information_schema.schemata; ``` --- #### 4. **注意事项** - **权限要求**:需具备`SELECT`权限访问`information_schema`(默认开放给管理员角色)。 - **结果长度限制**:`GROUP_CONCAT`默认最大返回长度为1024字节,可通过设置`group_concat_max_len`调整: ```sql SET SESSION group_concat_max_len = 1000000; ``` --- #### 5. **典型应用场景** - **快速获取数据库清单**:用于审计或备份前的验证 - **动态生成SQL脚本**:拼接`DROP DATABASE`或`SHOW TABLES`语句 - **渗透测试**:枚举数据库名称(需合法授权)[^1] --- ### 相关问题 1. 如何从`information_schema.tables`中获取指定数据库的所有表名? **示例**:`SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security';`[^1] 2. `GROUP_CONCAT`函数在SQL注入攻击中有哪些利用方式?如何防范? **提示**:过滤用户输入,避免直接拼接SQL语句[^2]。 3. 如何通过`GROUP_CONCAT`实现多列数据合并? **示例**:`SELECT GROUP_CONCAT(CONCAT_WS(':', schema_name, default_character_set_name)) FROM information_schema.schemata;`[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值