mysql - 如何更新mysql中的一行并插入新记录?

标签 mysql sql database

我有一个 mysql 表,列:

employee_id (PK), city, start_date(PK), end_date

"0123", "Boston", 01Jan2010, 01Jan2099

员工搬到另一个城市,所以必须向表中输入新记录,并且应该更新以前的end_date

"0123", "Boston", 01Jan2010, 08Sep2013
"0123", "Detroit", 08Sep2013, 01Jan2099

执行此操作最合适的 sql 语句是什么?

最佳答案

您可以在两个查询中执行更新或将其包装在存储过程中。

首先,更新此人的当前 end_date

UPDATE  tableName
SET     end_date = DATE_FORMAT(CURDATE(), '%d%b%Y')
ORDER   BY STR_TO_DATE(start_date, '%d%b%Y') DESC
LIMIT   1

其次,插入新记录。

INSERT INTO tableName(employee_id, city, start_date, end_date)
VALUES('0123', 'Detroit', DATE_FORMAT(CURDATE(), '%d%b%Y'), '01Jan2099')

这是一个存储过程,

DELIMITER ;;
CREATE PROCEDURE EmployeeRecord
(
    IN empID VARCHAR(15),
    IN newLoc VARCHAR(30)
)
BEGIN
    UPDATE  tableName
    SET     end_date = DATE_FORMAT(CURDATE(), '%d%b%Y')
    WHERE   employee_id = empID
    ORDER   BY STR_TO_DATE(start_date, '%d%b%Y') DESC
    LIMIT   1;

    INSERT INTO tableName(employee_id, city, start_date, end_date)
    VALUES(empID, newLoc, DATE_FORMAT(CURDATE(), '%d%b%Y'), '01Jan2099');
END ;;
DELIMITER ;

用法:

CALL EmployeeRecord('0123','Detroit')

作为旁注,请在存储日期时使用 DATE 或 DATETIME 数据类型,以避免在字段上使用函数,如果有索引,该函数会杀死索引。

关于mysql - 如何更新mysql中的一行并插入新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687706/

相关文章:

mysql - 热门报告指标 MYSQL

php - 如何使用代码点火器框架在查询 php 中将动态对象转换为数组

sql - Rails 动态 'Where' 子句

mysql - SQL - 按条目 X 彼此间隔的时间对表进行分组

php - 如何构建一个每个用户有 50 个变量的 MySQL 数据库?

mysql - 找不到导致mysql语句错误的问题

sql - Postgres : What is the query 'select * from user' actually doing?

python - 什么是存储 NLP 嵌入的好方法(nparrays 加信息)

mysql - 如何从 mysql 中的字段中提取部分文本?

mysql - 导入包含跨模态视图的数据库