0

我正在使用这个链接。

我已经用 Eclipse 将我的 cpp 文件连接到我的数据库,其中包含 3 个表(两个简单的表 PersonItem 第三个PersonItem连接它们的表)。在第三个表中,我使用一个简单的主键,然后使用两个外键,如下所示:

CREATE TABLE PersonsItems(PersonsItemsId int not null auto_increment primary key,
Person_Id int not null,
Item_id int not null,
constraint fk_Person_id foreign key (Person_Id) references Person(PersonId),
constraint fk_Item_id  foreign key (Item_id) references Items(ItemId));

所以,然后在 c 中嵌入 sql 我希望一个 Person 有多个项目。

我的代码:

   mysql_query(connection, \
   "INSERT INTO PersonsItems(PersonsItemsId, Person_Id, Item_id) VALUES (1,1,5), (1,1,8);");

    printf("%ld PersonsItems Row(s) Updated!\n", (long) mysql_affected_rows(connection));

   //SELECT newly inserted record.
   mysql_query(connection, \
   "SELECT Order_id FROM PersonsItems");

   //Resource struct with rows of returned data.
   resource = mysql_use_result(connection);

   // Fetch multiple results
   while((result = mysql_fetch_row(resource))) {
       printf("%s %s\n",result[0], result[1]);
   }

我的结果是

-1 PersonsItems Row(s) Updated!
5

但与VALUES (1,1,5), (1,1,8);

我希望这样

-1 PersonsItems Row(s) Updated!
5 8

有人能告诉我为什么这没有发生吗?亲切的问候。

4

2 回答 2

0

我怀疑这是因为您的第一次插入失败并出现以下错误:

Duplicate entry '1' for key 'PRIMARY'

因为您试图在主键中插入1两次PersonsItemsId,所以必须是唯一的(它也是 auto_increment 所以根本不需要指定值);

这就是受影响的行数为 -1 的原因,以及此行中的原因:

printf("%s %s\n",result[0], result[1]);

您只看到5因为在插入值后第一条语句失败(1,1,5),所以表中仍然有一行数据。

我认为要获得您期望的行为,您需要使用ON DUPLICATE KEY UPDATE语法:

INSERT INTO PersonsItems(PersonsItemsId, Person_Id, order_id) 
VALUES (1,1,5), (1,1,8)
ON DUPLICATE KEY UPDATE Person_id = VALUES(person_Id), Order_ID = VALUES(Order_ID);

SQL Fiddle 示例

或者不指定 personItemsID 的值,让 auto_increment 做它的事情:

INSERT INTO PersonsItems( Person_Id, order_id) 
VALUES (1,5), (1,8);

SQL Fiddle 示例

于 2013-10-02T13:52:10.237 回答
0

我认为您的两个查询中有错字或错误。

您正在插入“PersonsItemsId、Person_Id、Item_id”

INSERT INTO PersonsItems(PersonsItemsId, Person_Id, Item_id) VALUES (1,1,5), (1,1,8)

然后您的选择语句选择“Order_id”。

SELECT Order_id FROM PersonsItems

为了达到您要求的 5、8,您的第二个查询需要是:

SELECT Item_id FROM PersonsItems

编辑添加:

您的主键是autoincrement这样您就不需要将它传递给您的插入语句(事实上,当您传递 1 两次时它会出错)。

您只需要插入其他列:

INSERT INTO PersonsItems(Person_Id, Item_id) VALUES (1,5), (1,8)
于 2013-10-02T13:52:27.190 回答