我需要表中的两列在insert上具有相同的值。有没有办法从数据库端做到这一点?
答案 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