【问题标题】:auto increment second column [duplicate]自动递增第二列[重复]
【发布时间】:2013-03-01 13:15:08
【问题描述】:

我有一张有 2 列的表格。 ID 列自动递增。我正在尝试使用与id 列相同的 ID 自动递增用户列,但使用“用户”前缀(例如:user100,其中 ID 也是 100)基本上就像在 stackoverflow 上所做的一样。

CREATE TABLE test_table (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     user CHAR(30) NOT NULL,
     PRIMARY KEY (id)
) ENGINE=MyISAM;

有没有办法在 1 个查询中做到这一点?而不是插入数据库,然后查询获取ID,并将ID插入用户列?

【问题讨论】:

  • 为什么需要复制它(而且它正在复制)?
  • 字符不能自动递增...
  • 只有 Ints 可以自增
  • @DarylGill SO 不使用“Apache”,它使用 IIS7。 meta.stackexchange.com/questions/10369/…
  • @Sann 我的错,现在编辑

标签: mysql


【解决方案1】:

使用 BEFORE 触发器:

DELIMITER $$
CREATE TRIGGER test_table_trigger
BEFORE INSERT ON test_table
FOR EACH ROW BEGIN
    SET NEW.`user` = CONCAT(NEW.`user`, NEW.id);
END $$
DELIMITER ;

文档:MySQL triggers

【讨论】:

  • 我收到此错误 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 5 行的 '' 附近使用
  • "user" 似乎是保留字。我更新了代码(我在“用户”周围添加了反引号)。
  • 嗯,还是一样的错误
  • 我在 phpmyadmin 中检查过,它工作正常。将整个代码复制并粘贴到phpmyadmin中。
  • 你运行的是什么版本的mysql?在我的 Mac 上的 xampp 上,它的版本为 5.1.44
【解决方案2】:

你可以做一个触发器

触发前:

mysql> truncate table test_table;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter $$
mysql> CREATE TRIGGER test_table_trigger
    -> BEFORE insert ON test_table
    -> FOR EACH ROW
    -> BEGIN
    ->    SET new.user = CONCAT('user', (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='test_table'));
    -> END $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> INSERT INTO test_table values ();
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO test_table values ();
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO test_table values ();
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * FROM test_table;
+----+-------+
| id | user  |
+----+-------+
|  1 | user1 |
|  2 | user2 |
|  3 | user3 |
+----+-------+
3 rows in set (0.00 sec)

上面的内容应该在指定到id 列后使用自动增量,并将其附加到字符串user。自增ID是从Information_Schema拉出来的,好像是在一个事务或者很多查询中,可能设置错了。

【讨论】:

  • 不应该 AFTER INSERT 是 UPDATE 而不是 INSERT 再次?
  • 这将导致“重复键”错误,因为触发器将尝试插入具有相同 id 的另一条记录。
  • 使用之前阶段定义的 LAST_INSERT_ID() 将其更新到之前。
  • BEFORE 触发器不是这样工作的,你不能在触发器中写 INSERT。
  • @Waygood:不需要使用 UPDATE。只需正确使用 BEFORE 触发器,as described in the documentation 和关键字“SET”即可在插入之前更改“user”的值。无需使用 LAST_INSERT_ID(),因为 id 值存储在 NEW.id
【解决方案3】:

也许你可以试试这个,拿起最后插入的 id 并用转换后的值连接字符串:

INSERT INTO test_table (user) VALUES ('user')

UPDATE test_table
SET user = user + CAST(LAST_INSERT_ID() AS VARCHAR)
WHERE id = LAST_INSERT_ID()

【讨论】:

  • 只要这些语句在同一个连接上一起执行,并发是安全的。
  • 这是 2 个查询。可以在 1 内完成吗?
  • 也许您可以在子查询中使用 MAX(id),在 INSERT 语句中,假设数据没有被删除并且 ID 之间没有间隙
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2017-04-06
  • 2014-08-01
  • 2020-06-18
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多