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_id
(s_id
);
--
-- 表 message
的索引
更改表message
添加主键 (m_id
);
--
-- 表 message_send
的索引
更改表message_send
添加密钥m_id
(m_id
);
--
-- 表 projects
的索引
更改表projects
添加主键(pro_id
),添加键emp_id
(emp_id
),添加键s_id
(s_id
);
--
-- 表 project_milestone
的索引
更改表project_milestone
添加主键(pm_id
),添加键pm_id
(pm_id
,pro_id
,milestone
),添加键project_milestone_ibfk_1
(pro_id
);
--
-- 表 project_waiting
的索引
更改表project_waiting
添加主键(knight_id
,pm_id
),添加键knight_id
(knight_id
),添加键pm_id
(pm_id
);
--
-- 表 project_working
的索引
更改表project_working
添加主键(pm_id
,knight_id
),添加键pm_id
(pm_id
,knight_id
),添加键knight_id
(knight_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
)参考employers
(emp_id
)在更新级联删除级联时,
添加约束projects_ibfk_2
外键(s_id
)引用skills
(s_id
)在更新级联时删除级联;
--
-- 表约束project_milestone
更改表project_milestone
添加约束project_milestone_ibfk_1
外键(pro_id
)引用projects
(pro_id
);
--
-- 表格约束project_waiting
更改表project_waiting
添加约束project_waiting_ibfk_1
外键(pm_id
)参考project_milestone
(pm_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_milestone
(pm_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插入和更新不会更新或插入所有记录,只有少数记录的主要内容,如果未能解决你的问题,请参考以下文章