我正在创建一个类似模拟人生的游戏,但在使用 MySQL 时遇到了一些问题。我有以下功能:
snprintf(buffer, QUERY_MAX,
"INSERT INTO children (CHILD_ID, FIRST_NAME, LAST_NAME, AGE, CLEAN, HUNGRY, THIRSTY, DOLLARS, PLAYER_ID) VALUES (%d, '%s', '%s', %d, %f, %f, %f, %d, %d);",
0,
m_firstName.c_str(),
m_lastName.c_str(),
m_age,
0.0f,
0.0f,
0.0f,
3,
0);
if (!conn.executeNonQuery(buffer))
exit(0);
这样就成功插入了一条记录。但是,我想摆脱 CHILD_ID
在此脚本中的一部分并让它自动递增。
当我进入 MySQL Workbench 时,CHILD_ID
有以下信息:INT(11)
, PK
, NN
, UQ
,和UN
。该表有一个外键 (PLAYER_ID)
,它指向PLAYER_ID
在 PLAYERS
table 。
AI 未选中 CHILD_ID
,所以我一边检查一边认为我的问题已经解决了。我正准备去申请这是它生成的脚本:
ALTER TABLE `mvs`.`children`
CHANGE COLUMN `CHILD_ID` `CHILD_ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ;
然后弹出此错误消息:
Operation failed: There was an error while applying the SQL script to the database. Executing: ALTER TABLE
mvs
.children
CHANGE COLUMNCHILD_ID
CHILD_ID
INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ;ERROR 1833: Cannot change column 'CHILD_ID': used in a foreign key constraint 'FK_CHAR_TO_CHILD_ID' of table 'mvs.characteristics' SQL Statement: ALTER TABLE
mvs
.children
CHANGE COLUMNCHILD_ID
CHILD_ID
INT(11) UNSIGNED NOT NULL AUTO_INCREMENT
它似乎指的是我的特征表,其中保存了在 child 中找到的child_id的一般信息。
特征表中有CHAR_ID
如INT(10)
, PK
, NN
, UQ
, UN
,和AI
。它有一个FK
的CHILD_ID INT(10)
, NN
, UQ
,和UN
。引用表为children
,栏CHILD_ID
,引用栏目:CHILD_ID
。
总的来说,我想在插入CHILDREN
时自动增加新的子记录。 。作为最近接触 MySQL 的新手,我对这个错误消息所指的内容以及解决方案感到困惑。不知道是不是我对FK's
的理解比较少以及是否确实需要它们。截至目前,我让每个表都引用其父表。 child 有一个 parent ID,特征有一个 child ID,等等。
任何提示都有帮助,谢谢!
最佳答案
尝试将数据类型更改为BIGINT
。您不需要在查询中添加childID
,因为您使用的是AUTO Increment
。也许您可以在代码上使用一个增量,而不是每次插入。
关于MySQL 不增加主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262715/