使用另一个自动递增字段值MySQL更新字段

时间:2018-12-23 22:34:54

标签: mysql

我在MYSQL数据库中有一个包含两个字段的表:

  1. Id(自动递增字段)。
  2. Post_Id。

当我插入新记录时,两个字段应具有相同的值。因此,我应该用id值更新post_id,同时确保我用正确的值而不是任何其他新插入的记录值来更新字段。

我尝试了此SQL语句,但是它非常慢,并且不确定是否选择了正确的值:

set @auto_id := (SELECT AUTO_INCREMENT 
                FROM INFORMATION_SCHEMA.TABLES
                WHERE TABLE_NAME='table_name'
                  AND TABLE_SCHEMA=DATABASE() ); 

update table_name set post_id= @auto_id where id=@auto_id ;

我对MySQL经验不足,因此无法更改表结构。

2 个答案:

答案 0 :(得分:1)

您遵循的方法也不安全。

我能想到的最好的选择是使用触发器

编辑:根据@lagripe的提及

CREATE TRIGGER sometrigger
AFTER INSERT ON sometable
BEGIN
  SET NEW.post_id := (SELECT id from sometable order by DESC limit 1) + 1 ; // you may need +1 here. I couldn't test it.
END

或者您可以考虑使用LAST_INSERT_ID

insert into table_name values ( .... );
update table_name set post_id = LAST_INSERT_ID();

但是为什么首先需要两列具有相同ID的列?

如果确实需要,为什么不使用计算/生成的列?

CREATE TABLE Table1(
  id DOUBLE,
  post_id DOUBLE as (id)
);

答案 1 :(得分:0)

您可以使用触发器:

CREATE TRIGGER UpdatePOST_id
BEFORE INSERT ON table_db
FOR EACH ROW 
SET NEW.post_id := (select id from table_db order by id DESC LIMIT 1)+1 ;

从现在开始,无论您在post_id列中作为值插入什么,都将被自动插入的ID取代。

测试:

    |id|post_id|
    |20|  20   |
    |21|  21   |
    |22|  22   |
    |23|  23   |

要删除触发器:

DROP trigger UpdatePOST_id