在MySQL中,如何在插入时在另一列中使用autoincrement值?

在MySQL中,如何在插入时在另一列中使用autoincrement值?,mysql,auto-increment,sql-insert,Mysql,Auto Increment,Sql Insert,我希望在插入过程中,自动设置的autoincrement包含在另一列中。例如,在一个表中,ID是autoincrement,Name是另一列,我想做如下操作 `INSERT INTO Names (Name) VALUES (CONCAT("I am number ",ID));` 目前,我在没有名字的情况下进行插入,然后我必须在插入后立即使用$mysqli->INSERT\u id进行更新 我不想提前查询表,因为在获取下一个自动增量值和插入之间,可能会插入另一条记录,时间越短越好。扳机可能会

我希望在插入过程中,自动设置的autoincrement包含在另一列中。例如,在一个表中,ID是autoincrement,Name是另一列,我想做如下操作

`INSERT INTO Names (Name) VALUES (CONCAT("I am number ",ID));`
目前,我在没有名字的情况下进行插入,然后我必须在插入后立即使用$mysqli->INSERT\u id进行更新

我不想提前查询表,因为在获取下一个自动增量值和插入之间,可能会插入另一条记录,时间越短越好。扳机可能会起作用,但似乎杀伤力过大。我只是想知道我是否可以在插入中引用自动增量


非常感谢

问题不像看上去那么容易。在插入之前的
触发器中,尚未生成自动增量值(
NEW.autoinc_列
0
),在插入之后的
触发器中,无法再更改要插入的值

使用MyISAM表格,您可以检查表格定义中的下一个
AUTO_INCREMENT
值:

DELIMITER //    

    CREATE TRIGGER inserName BEFORE INSERT ON name FOR EACH ROW
    BEGIN
        DECLARE next_ai INT;
        SELECT auto_increment INTO next_ai
          FROM information_schema.tables
          WHERE table_schema = DATABASE() AND table_name = 'name';
        SET NEW.name = CONCAT("I am number ", next_ai);
    END //

DELIMITER ;
我相信如果InnoDB_autoinc_lock_mode=0(默认情况下不是这样),这也可以用于InnoDB表,但我不确定(因为可能存在并发问题)

但如果concat的值始终相同,则可能最好使用以下视图:

CREATE VIEW names_v AS SELECT id, CONCAT("I am number ", id) AS name FROM names;

我最近也面临着这个问题,虽然这可能不是最好的解决方案,但我所做的可能是一个可行的替代方案为您的情况。就我而言,这已经足够了。您可以使用AFTER INSERT触发器使用引用伪变量NEW的值更新字段。这可能会给你更多的灵活性。 我需要用一个字符串填充一个字段,该字符串是使用自动递增列中的值计算的。 触发器读取新的伪变量,计算必要的值并执行更新。
它仍然需要对数据库进行两次高级写访问,但所有操作都是连续完成的,不需要与客户机应用程序进一步交互(实际上,从客户机应用程序发送一条insert语句,然后进行隐式更新)。

我还没有尝试,但是,如果在插入查询中仅按名称引用id字段,这是否无效?您是否尝试过使用
TRIGGER
?JW,我已经了解了如何使用
TRIGGER
,它似乎有点“远离插入”。如果我不能将其放在插件中,我将保留
更新
。Andrew,我假设它是在自动增量之前还是之后取值是不明确的,所以我刚才试过了。也许我想错了。我得到了“我是0号”。未进行自动增量数据的to设置。即使这样做了,我仍然担心它在不同的SQLs.YaK上可能会有不同的工作方式,谢谢您深思熟虑的回复。我不打算使用
触发器
,因为它似乎和您描述的一样复杂。(名字并不总是一样的;我只是想给出一个起始值。)问题是,我不认为这可以通过任何其他方式实现,除非有一个触发器。或者可能有一些复杂的问题:
INSERT INTO names(name)VALUE(CONCAT('I am number',从information_schema.tables中选择auto_increment,其中table_schema=DATABASE()和table_name='name');)<代码>名称
并不总是相同的,但它是确定的吗?视图定义也可以类似于
创建视图名称作为SELECT id,someCustomFunction(id)作为name FROM name:)谢谢,牦牛-更好的词。不,名称并不总是确定的(或公式化的)。我只是给出一个默认值。