SQL插入和更新不会更新或插入所有记录,只有少数记录

Posted

技术标签:

【中文标题】SQL插入和更新不会更新或插入所有记录,只有少数记录【英文标题】:SQL insert and update doesn't update or insert all the records, only a few record 【发布时间】:2015-10-13 08:57:46 【问题描述】:

我的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

P1_2-K1

我的完整数据库

-- phpMyAdmin SQL Dump

-- 版本 4.3.11

-- http://www.phpmyadmin.net

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

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";

--

-- 数据库:knightit

如果不存在则创建数据库knightit 默认字符集 utf8 COLLATE utf8_unicode_ci; 使用knightit;


--

-- 表admin的表结构

如果存在则删除表admin; 如果不存在则创建表 admin ( id varchar(16) 整理 utf8_unicode_ci 非空, password binary(60) 非空, level int(2) 非空 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表employers的表结构

如果存在则删除表 employers; 如果不存在则创建表 employers ( emp_id varchar(16) 整理 utf8_unicode_ci NOT NULL DEFAULT '', password longtext COLLATE utf8_unicode_ci NOT NULL, email varchar(32) 整理 utf8_unicode_ci 非空, emp_name 文本整理 utf8_unicode_ci, coins bigint(20) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表knights的表结构

如果存在则删除表knights; 如果不存在则创建表knights ( knight_id varchar(16) 整理 utf8_unicode_ci 非空, password longtext COLLATE utf8_unicode_ci NOT NULL, knight_name 文本整理 utf8_unicode_ci, email varchar(32) 整理 utf8_unicode_ci 非空, s_id varchar(16) 整理 utf8_unicode_ci DEFAULT NULL, points int(11) 默认“0”, coins int(32) NOT NULL DEFAULT '0', status bit(2) 默认 b'1', bio longtext COLLATE utf8_unicode_ci ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表message的表结构

如果存在则删除表message; 如果不存在则创建表message ( m_id varchar(16) 整理 utf8_unicode_ci 非空, content 文本整理 utf8_unicode_ci 不为空, send_date 日期不为空 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表message_send的表结构

如果存在则删除表message_send; 如果不存在则创建表 message_send ( m_id varchar(16) 整理 utf8_unicode_ci 非空, receiver_id varchar(16) 整理 utf8_unicode_ci 非空, status bit(1) NOT NULL DEFAULT b'0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表projects的表结构

如果存在则删除表projects; 如果不存在则创建表projects ( pro_id varchar(16) 整理 utf8_unicode_ci 非空, pro_name 文本整理 utf8_unicode_ci 不为空, emp_id varchar(16) 整理 utf8_unicode_ci 非空, p_describe 文本整理 utf8_unicode_ci 非空, price int(32) 非空, cut int(32) 非空, s_id varchar(16) 整理 utf8_unicode_ci 非空, status bit(2) NOT NULL DEFAULT b'1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表project_milestone的表结构

如果存在则删除表project_milestone; 如果不存在则创建表 project_milestone ( pm_id varchar(16) 整理 utf8_unicode_ci 非空, pro_id varchar(16) 整理 utf8_unicode_ci 非空, milestone int(2) 非空, job 文本整理 utf8_unicode_ci, deadline int(3) 默认为空, knight_amt int(2) 默认为空 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表project_waiting的表结构

如果存在则删除表project_waiting; 如果不存在则创建表project_waiting ( pm_id varchar(16) 整理 utf8_unicode_ci 非空, knight_id varchar(16) 整理 utf8_unicode_ci 非空, chosen bit(1) NOT NULL DEFAULT b'0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表project_working的表结构

如果存在则删除表 project_working; 如果不存在则创建表 project_working ( pm_id varchar(16) 整理 utf8_unicode_ci 非空, knight_id varchar(16) 整理 utf8_unicode_ci 非空, submit 日期默认为空, approve tinyint(1) 默认为空, paid tinyint(1) 默认为空, coins_paid int(32) 默认为空 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表security的表结构

如果存在则删除表security; 如果不存在则创建表 security ( name varchar(100) 整理 utf8_unicode_ci 非空, value longtext COLLATE utf8_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--

-- 表skills的表结构

如果存在则删除表skills; 如果不存在则创建表skills ( s_id varchar(16) 整理 utf8_unicode_ci 非空, skill_name 文本整理 utf8_unicode_ci 非空 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--

-- 转储表的索引

--

-- 表 admin 的索引

更改表admin 添加主键 (id);

--

-- 表 employers 的索引

更改表employers 添加主键 (emp_id);

--

-- 表 knights 的索引

更改表knights 添加主键(knight_id),添加键s_ids_id);

--

-- 表 message 的索引

更改表message 添加主键 (m_id);

--

-- 表 message_send 的索引

更改表message_send 添加密钥m_id (m_id);

--

-- 表 projects 的索引

更改表projects 添加主键(pro_id),添加键emp_idemp_id),添加键s_ids_id);

--

-- 表 project_milestone 的索引

更改表project_milestone 添加主键(pm_id),添加键pm_idpm_idpro_idmilestone),添加键project_milestone_ibfk_1pro_id);

--

-- 表 project_waiting 的索引

更改表project_waiting 添加主键(knight_id,pm_id),添加键knight_idknight_id),添加键pm_idpm_id);

--

-- 表 project_working 的索引

更改表project_working 添加主键(pm_id,knight_id),添加键pm_idpm_idknight_id),添加键knight_idknight_id);

--

-- 表 security 的索引

更改表security 添加主键 (name);

--

-- 表 skills 的索引

更改表skills 添加主键 (s_id);

--

-- 转储表的约束

--

-- 表格约束knights

更改表knights 添加约束 knights_ibfk_1 外键 (s_id) 引用 skills (s_id) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- 表 message_send 的约束

更改表message_send 添加约束 message_send_ibfk_1 外键 (m_id) 引用 message (m_id) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- 表 projects 的约束

更改表projects 添加约束projects_ibfk_1外键(emp_id)参考employersemp_id)在更新级联删除级联时, 添加约束projects_ibfk_2外键(s_id)引用skillss_id)在更新级联时删除级联;

--

-- 表约束project_milestone

更改表project_milestone 添加约束project_milestone_ibfk_1外键(pro_id)引用projectspro_id);

--

-- 表格约束project_waiting

更改表project_waiting 添加约束project_waiting_ibfk_1外键(pm_id)参考project_milestonepm_id)在更新级联删除级联时, 添加约束 project_waiting_ibfk_2 外键 (knight_id) 引用 knights (knight_id) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- 表格约束project_working

更改表project_working 添加约束project_working_ibfk_1外键(pm_id)参考project_milestonepm_id)在更新级联删除级联时, 添加约束 project_working_ibfk_2 外键 (knight_id) 引用 knights (knight_id) ON DELETE CASCADE ON UPDATE CASCADE;

【问题讨论】:

你更新然后插入同一行? 是的,我更新了project_waiting 然后在project_working 中插入一个新的 您对 PHPMyAdmin 和您的 PHP 代码使用相同的用户吗?您的数据库用户是否有足够的权限更新查询? 当我在 localhost/phpmyadmin 的 SQL 命令上运行它时。它运行完美。我使用 XAMPP 5.6.8、PHP 5.6.8、MYSQL 5.0.11 而你的 PHP 代码使用的是同一个用户? :) 【参考方案1】:

我已经解决了问题,将所有这些合并到一个查询中:

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(...);

【讨论】:

以上是关于SQL插入和更新不会更新或插入所有记录,只有少数记录的主要内容,如果未能解决你的问题,请参考以下文章

sql级联更新和级联删除不起作用

SQL Server 根据字段的值触发插入和/或更新的记录

SQL Server 视图插入更新

使用 Petapoco 批量插入/更新

sql server 判断记录存在更新不存在插入

PL / SQL触发器在更新或插入后更新同一个表