两个自动增量列或自动增量列和其他列中的相同值

时间:2016-07-12 08:56:43

标签: mysql laravel-5 auto-increment

我需要表中的两列在insert上具有相同的值。有没有办法从数据库端做到这一点?

3 个答案:

答案 0 :(得分:0)

定义插入触发器之前或之后,并在触发器中指定第2个字段的值。

如果第一个字段是自动增量列,则需要使用后插入触发器。如果您的应用程序为第一个字段分配值,那么您可以使用before insert trigger。

但是,我不一定会复制insert上的值。您可以在插入时将第二个字段保留为null,这意味着它的值与第一个字段相同。这种方法的唯一缺点是在第二个字段上创建连接可能更困难。

答案 1 :(得分:0)

所以你想让一列使用auto_increment功能,但是让同一个表中的另一列也具有相同的值?

我想不出你需要这个功能的原因。也许你可以解释一下你想要完成什么,我可以建议一个不同的解决方案吗?

触发器不适用于此。这是一个鸡蛋问题:

  • 您无法在AFTER触发器中更改任何列的值。
  • 但是当执行BEFORE触发器时,尚未设置自动增量值。

使用MySQL 5.7 GENERATED列也是行不通的:

CREATE TABLE MyTable (
  id INT AUTO_INCREMENT PRIMARY KEY,
  why_would_you_want_this INT GENERATED ALWAYS AS (id)
);

ERROR 3109 (HY000): Generated column 'why_would_you_want_this' 
cannot refer to auto-increment column.

您无法在单个SQL语句中执行此操作。您必须INSERT该行,然后立即执行UPDATE将第二列设置为相同的值。

CREATE TABLE MyTable (
  id INT AUTO_INCREMENT PRIMARY KEY,
  why_would_you_want_this INT
);

INSERT INTO MyTable () VALUES ();

UPDATE MyTable SET why_would_you_want_this = LAST_INSERT_ID() 
WHERE id = LAST_INSERT_ID();

您也可以使用AUTO_INCREMENT之外的其他一些机制生成ID值(例如Memcached递增键)。然后,您可以在两列中插入新值:

INSERT INTO MyTable (id, why_would_you_want_this) VALUES ($gen_id, $gen_id);

答案 2 :(得分:0)

您可以通过使用主键(假定为id)并设置列(假定为columnName)在一个查询中执行此操作:

"INSERT INTO tableName SET `columnName` = (SELECT MAX(x.id) FROM tableName x)+1"

但是,如果您删除了最近的主键行,则此操作将无效。要克服这个问题,您也可以插入ID:

"INSERT INTO tableName SET `columnName` = (SELECT MAX(x.id) FROM tableName x)+1, `id`= (SELECT MAX(x.id) FROM tableName x)+1" 

但是,此解决方案具有重复使用已经删除的主键值的缺点(或取决于情况)。

建议方式:
要使用实际的auto_increment值,您可以执行以下操作:

"INSERT INTO tableName SET `columnName` = (SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name')"

帮助我解决此问题的来源:
Prashant Pimpale's answer