如何同时更新和插入
require_once ('database.php');
$name = mysql_real_escape_string ($_REQUEST["name"]);
$course = mysql_real_escape_string ($_REQUEST["course"]);
$email = mysql_real_escape_string ($_REQUEST["email"]);
$contact = mysql_real_escape_string ($_REQUEST["contact"]);
$Date = mysql_real_escape_string ($_REQUEST["Date"]);
$sql = "SELECT * FROM registerlist WHERE name = '" . $name . "'";
$result = mysql_query ($sql, $dbconn);
if (mysql_num_rows ($result) > 0) {
$resultStr = header("Location:blog.php");
} else {
$result = "SELECT * FROM courselist WHERE cname = '" . $course
. "'";
$row=mysql_fetch_row($result);
$sql = "INSERT INTO registerlist (name, Course, Email, Contact,
Date) VALUES ('" . $name . "', '" . $course . "', '" . $email . "', '" .
$contact . "','" . $date . "')";
$result1= mysql_query($sql, $dbconn);
$result =mysql_query("UPDATE courselist SET $Row['slot'] =
'$Row['slot'] - 1 '");
if ($result1) {
$resultStr = header("Location:blog.php");
}
}
echo json_encode($resultStr);如果个人注册了课程,课程时隙将减1,学生文档将被插入注册表数据库。
发布于 2019-02-18 22:15:28
我希望我没有理解错:您希望在向registerlist表中插入记录的同时更新courselist表吗?这可以使用触发器(如果两个数据库在同一个SQL server上运行,则为https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)和/或表锁(https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html)来完成:
不带触发器的
- Lock table `courselist`
- Insert the record to `registerlist`
- Update table `courselist`
- Release table `courselist`
registerlist表之前锁定表courselist的触发器,以及一个更新courselist并在写入registerlist之后释放锁的触发器。在这种情况下,您只需将记录从PHP代码插入到registerlist中,并且表锁定和courselist更新是由SQL server中的触发器完成的。在任何情况下,您都不能同时写入这两个表,因为没有SQL语句可以做到这一点。但是使用锁可以模拟这样的行为。
在定义SQL语句的目标表时,如果连接默认使用不同的数据库,则可以在表的数据库名称前加上databaseName.tableName。
但是来自评论的评论是绝对正确的-你应该尽快远离mysql_*!
SQL :这个示例应该显示表锁定是如何工作的(可以在上面的链接中的MySQL文档中找到关于表锁定的所有信息):
LOCK TABLES courselist WRITE;
INSERT INTO registerlist …;
UPDATE courselist …;
UNLOCK TABLES;您将需要一个WRITE锁,因为您将写入表。来自其他会话的其他读取、写入或锁定语句将被阻塞,直到您释放锁为止。
READ锁将防止表被任何会话修改。在您释放锁之前,写入(和写入锁定)尝试都会被阻止,来自其他会话的所有其他READ锁也会被释放。
https://stackoverflow.com/questions/54748891
复制相似问题