当前位置: 首页 > 知识库问答 >
问题:

SQL insert and update不更新或插入所有记录,只更新或插入少数记录

弘志勇
2023-03-14

我的php代码:

    for($i=0;$i<num_rows($sql);$i++)
        if(isset($_POST['knight'.$i]))
        {
            $data=
            [
                $pm_id=$_POST['pm_id'.$i],
                $knight_id=$_POST['knight'.$i],
            ];
            mysql_query("update `project_waiting` set `chosen`=(b'1') where `pm_id`='$pm_id' and `knight_id`='$knight_id';");
            mysql_query("insert into `project_working`(`pm_id`,`knight_id`) values('$pm_id','$knight_id');");
        }

当我使用echo而不是mysql_query时,它返回:

update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_1' and `knight_id`='K1';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_1','K1');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_1' and `knight_id`='K2';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_1','K2');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_1' and `knight_id`='K3';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_1','K3');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_1' and `knight_id`='K4';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_1','K4');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_2' and `knight_id`='K1';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_2','K1');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_2' and `knight_id`='K4';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_2','K4');
update `project_waiting` set `chosen`=(b'1') where `pm_id`='P1_3' and `knight_id`='K2';
insert into `project_working`(`pm_id`,`knight_id`) values('P1_3','K2'); 

它在我的phpmyadmin上运行得很好,但是当我将echo更改为mysql_query时,它只影响5行(两个表)

P1_1-K1

P1_1-K4

P1_1-K3

P1_1-K2

P12-K1

我的完整数据库

-- phpMyAdmin SQL Dump

--版本4.3.11

--主机:127.0.0.1--生成时间:2015年7月23日下午12:16--服务器版本:5.6.24--PHP版本:5.6.8

设置SQL_MODE=“no_auto_value_on_zero”;设置time_zone=“+00:00”;

--

创建数据库(如果不存在)knightit默认字符集utf8整理utf8_unicode_ci;使用knightit

--

删除表(如果存在admin);如果不存在则创建表admin(idvarchar(16)COLLATE utf8_unicode_ci不为空,passwordbinary(60)不为空,levelint(2)不为空)engine=innoDB DEFAULT charset=utf8 COLLATE=utf8_unicode_ci;

--

如果存在雇主,则删除表;如果不存在则创建表empores(emp_idvarchar(16)COLLATE utf8_unicode_ci NOT NULL默认''、passwordlongtext COLLATE utf8_unicode_ci NOT NULL、emailvarchar(32)COLLATE utf8_unicode_ci NOT NULL、emp_nametext COLLATE

--

如果存在骑士则删除表;如果不存在则创建表knights(knight_idvarchar(16)整理utf8_unicode_ci不为空,passwordlongtext整理utf8_unicode_ci不为空,knight_nametext整理utf8_unicode_ci,emailvarchar(32)整理utf8_unicode_ci,s_idvarchar(16)整理utf8_unicode_ci不为空

--

如果存在消息,则删除表;如果不存在则创建表消息(m_idvarchar(16)COLLATE utf8_unicode_ci不为空,内容文本COLLATE utf8_unicode_ci不为空,send_datedate不为空)engine=innoDB DEFAULT charset=utf8 COLLATE=utf8_unicode_ci;

--

如果存在message_send,则删除表;如果不存在则创建表message_send(m_idvarchar(16)COLLATE utf8_unicode_ci不为NULL,receiver_idvarchar(16)COLLATE utf8_unicode_ci不为NULL,status位(1)不为NULL默认值b'0')engine=innoDB DEFAULT charset=utf8 COLLATE=utf8_unicode_ci;

--

如果存在项目,则删除表;如果不存在项目则创建表(pro_idvarchar(16)COLLATE utf8_unicode_ci不为空,pro_nametext COLLATE utf8_unicode_ci不为空,emp_idvarchar(16)COLLATE utf8_unicode_ci不为空,p_descripetext COLLATE utf8_unicode_ci不为空,p_descripetext COLLATE

--

如果存在project_milestone,则删除表;如果不存在则创建表project_milestone(pm_idvarchar(16)COLLATE utf8_unicode_ci不为空,pro_idvarchar(16)COLLATE utf8_unicode_ci不为空,milestoneint(2)不为空,jobtext COLLATE utf8_unicode_ci,deadlineint(3)默认为空,knight_amtint(2)默认

--

如果存在project_waiting,则删除表;如果不存在则创建表project_waiting(pm_idvarchar(16)COLLATE utf8_unicode_ci不为NULL,knight_idvarchar(16)COLLATE utf8_unicode_ci不为NULL,chelect位(1)不为NULL默认b'0')engine=innoDB默认charset=utf8 COLLATE=utf8_unicode_ci;

--

如果存在project_working,则删除表;如果不存在则创建表project_working(pm_idvarchar(16)COLLATE utf8_unicode_ci不为空,knight_idvarchar(16)COLLATE utf8_unicode_ci不为空,submitdate默认为空,approvaltinyint(1)默认为空,paytinyint(1)默认为空,payint(32)默认为空)

--

删除表(如果存在security);如果不存在则创建表security(namevarchar(100)COLLATE utf8_unicode_ci不为空,valuelongtext COLLATE utf8_unicode_ci不为空)engine=innoDB DEFAULT charset=utf8 COLLATE=utf8_unicode_ci;

--

如果存在技能,则删除表;如果不存在则创建表skills(s_idvarchar(16)COLLATE utf8_unicode_ci不为空,skill_nametext COLLATE utf8_unicode_ci不为空)engine=innoDB DEFAULT charset=utf8 COLLATE=utf8_unicode_ci;

--

--

ALTER TABLEADMIN添加主键(ID);

--

ALTER TABLE雇主添加主键(emp_id);

--

ALTER TABLEknights添加主键(knight_id),添加键s_id(s_id);

--

ALTER TABLE消息添加主键(M_ID);

--

ALTER TABLEMESSAGE_SENDADD KEYM_ID(M_ID);

--

ALTER TABLEprojects添加主键(pro_id)、添加键emp_id(emp_id)、添加键s_id(s_id);

--

ALTER TABLEproject_milestone添加主键(pm_id),添加键pm_id(pm_id,pro_id,milestone),添加键project_milestone_ibfk_1(pro_id);

--

ALTER TABLEproject_waiting添加主键(knight_id,pm_id)、添加键knight_id(knight_id)、添加键pm_id(pm_id);

--

ALTER TABLEproject_working添加主键(pm_id,knight_id)、添加键pm_id(pm_id,knight_id)、添加键knight_id(knight_id);

--

ALTER TABLEsecurity添加主键(name);

--

ALTER TABLE技巧添加主键(S_ID);

--

--

更改表knights添加约束knights_ibfk_1外键(s_id)引用skills(s_id)时删除级联时更新级联;

--

ALTER TABLEMESSAGE_SEND添加约束MESSAGE_SEND_IBFK_1外键(M_ID)引用更新级联上的DELETE级联上的消息(M_ID);

--

更改表projects添加约束projects_ibfk_1外键(emp_id)引用在更新级联的删除级联上的雇主(emp_id),添加约束projects_ibfk_2外键(s_id)引用在更新级联的删除级联上的技能(s_id);

--

ALTER TABLEproject_milestone添加约束project_milestone_ibfk_1外键(pro_id)引用项目(pro_id);

--

ALTER TABLEPROJECT_WAITING添加约束PROJECT_WAITING_IBFK_1外键(PM_ID)引用更新级联上的DELETE级联上的PROJECT_WAITING_IBFK_(PM_ID),添加约束PROJECT_WAITING_IBFK_2外键(Knight_ID)引用更新级联上的DELETE级联上的Knights(

--

ALTER TABLEPROJECT_WORKING添加约束PROJECT_WORKING_IBFK_1外键(PM_ID)引用更新级联上的DELETE级联上的PROJECT_WORKING_IBFK_2外键(KNIGHT_ID)引用更新级联上的DELETE级联上的KNIGHT(KNIGHT_ID);


共有1个答案

何浩荡
2023-03-14

我已经通过将所有查询组合到一个查询中来解决了这个问题:

insert into `project_working`(`pm_id`,`knight_id`) values('P1_1','K1'),('valueX','valueY');
update set `chosen`=true where (`pm_id`='P1_3' and `knight_id`='K2') or (`pm_id`='P1_1' and `knight_id`='K1') or(...);
 类似资料:
  • 我想向数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行。 我的问题是: 但是,它将继续插入新的记录。假设是唯一键。如果存在,则不会将新记录插入数据库;同时更新记录。 我也试过这个: 我不确定我的代码是否存在for循环问题。 我使用for循环插入所有数据。 这是echo$query的输出; SQL表

  • 问题内容: 我有一张桌子Cars and CarDescriptions cars:IDCar(int,PK,autoincrement)carsDesciptions(IDDescription,Header(nvarchar),Content(nvarchar),idCar(int,FK) 在应用程序中,我正在添加汽车并编辑现有汽车。 我的问题: 1.如何在数据库中保存更改后的带有描述的Car

  • 问题内容: 有没有办法像在MySQL服务器上那样批量执行查询? 将无法使用,因为如果该字段已经存在,它将直接忽略该字段并且不插入任何内容。 将无法工作,因为如果该字段已经存在,它将首先对其进行处理,然后再次进行处理,而不是对其进行更新。 可以使用,但不能批量使用。 因此,我想知道是否可以批量发出这样的命令(一次不止一次发送)。 问题答案: 您 可以 使用INSERT … ON DUPLICATE

  • 问题内容: 我有一个产品对象,它属于某些类别,即经典的多对一关系。 我想插入和更新产品而不预先选择类别。像这样: 要么 是否可以在不选择类别的情况下进行更新和插入?我不想为此使用HQL或直接查询。 问题答案: session.load()专门用于此类情况。以下: 不会打数据库。但是,如果没有提供给定ID的类别,它将在稍后阶段(刷新期间或多或少)引发异常。 使用速度快且没有副作用(级联等)。

  • 我已经开始在Android上使用Realm了。到目前为止,我很喜欢它,但我在试图理解如何正确使用“copyToRealmOrUpdate”时遇到了一些问题。 每次打开应用程序时,我都会收到一个带有X“contacts”的JSON(我正在将它映射到Contact RealmObject数组中),如果它们不存在,我想将它们插入Realm DB,或者在它们存在时更新它们。 这里的问题是,每次我这样做时,

  • 问题内容: 我正在尝试在两个SQL Server 2008表之间移动一些数据。如果该记录存​​在于表2中,并且带有来自表1的电子邮件,则使用来自表1的数据更新该记录,否则插入新记录。 在表1中,我有许多列;名字,姓氏,电子邮件等。 我不确定如何构造查询以更新Table2(如果来自Table1的电子邮件存在)或插入新行(如果Table2中不存在来自Table1的电子邮件)。 我尝试在Google上进