【问题标题】:PHP Mysql How to make a field get the same value of the auto increment id [duplicate]PHP Mysql如何使字段获得与自动增量ID相同的值[重复]
【发布时间】:2012-12-12 22:29:52
【问题描述】:

可能重复:
MySQL trigger to update a field to the value of id

请给我一张包含三个字段的表格:

Id (auto increment)
GroupById
Text

我希望在插入新行时:如果我将字段 groupById 留空,则默认情况下它必须获得与字段 ID 相同的值。

请问您有什么想法吗?提前致谢。

编辑:我的代码:

mysql_query("INSERT INTO group SET GroupById = (must get the current Id), Text = 'bla bla bla' ");

【问题讨论】:

  • 你能展示一些你试过的代码吗?
  • 停止使用 mysql_* 函数,因为那些被贬低的函数使用 misqli 或 PDO。
  • 为什么?将相同的值存储在 2 个不同的位置是多余的,并且会破坏规范化。
  • 为什么?猜测一下,这是系统或用户可能更改的默认值。

标签: php mysql


【解决方案1】:

触发器怎么样:

DELIMITER $$
CREATE TRIGGER trg_yourtable
BEFORE INSERT ON yourtable
FOR EACH ROW
BEGIN
  IF NEW.GroupById IS NULL THEN
    SET NEW.GroupById = (
        SELECT AUTO_INCREMENT 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = DATABASE() 
            AND TABLE_NAME = 'yourtable'
    );
  END IF;
END $$

我不确定这是多么安全...或者当您从一个查询中插入多行时会发生什么,或者当两个连接尝试同时插入时...但它确实有效。

【讨论】:

    【解决方案2】:

    这个简单的 SQL 应该做你想做的事:

    INSERT INTO myTable (GroupById, Text) VALUES (NULL, 'your text');
    SET @lastID = LAST_INSERT_ID();
    UPDATE myTable SET GroupById = @lastID WHERE Id = @lastID;
    

    【讨论】:

    • 我向您致敬,先生;在这里,你有我的赞成票。
    • @Kneel-Before-ZOD:感谢您的荣誉和您的体育精神 :-)
    【解决方案3】:

    使用存储过程

    1. 获取 MAX id
    2. 向其中添加 1 并将其添加到两行中

    您只需一次交易即可获得所需的结果。

    希望这会有所帮助。

    【讨论】:

    • MAX(Id) 是个坏主意。如果并发 INSERT 由另一个请求执行并在您的第二条语句执行之前增加主键怎么办?
    • 如果一个并发的insert语句在第二条语句执行之前执行,会发生错误(因为主键),导致整个过程回滚。顺便说一句,您的解决方案对于您提到的同一问题并非万无一失。
    • 只有在您选择支持事务的存储引擎时才能进行回滚,而 MySQL 并非总是如此。我的解决方案会起作用,因为 LAST_INSERT_ID() 的范围是当前连接。
    【解决方案4】:

    使用这个function |测试过

    使用示例:

    function get_current_insert_id($table)
    {
        $q = "SELECT LAST_INSERT_ID() FROM $table"; 
        return mysql_num_rows(mysql_query($q)) + 1;
    }
    
    $txt = "text";
    $groupID = '';
    
    if ( empty($groupID) ) { $groupID = get_current_insert_id(test);  } 
    
    $query = mysql_query("INSERT INTO test VALUES ('', '$groupID', '$txt') "); 
    
    if ( $query ) { echo 'Saved using ID:' . $groupID; } else { echo 'Oh noes!' . $query; }
    

    【讨论】:

    • 谢谢,看起来不错,但是插入总是1,也许是因为我使用的是MySQLi?
    【解决方案5】:

    看起来您可能需要运行 2 个查询:

    1. insert into 'table' ('GroupById', 'Text') VALUES ('{group id}', '{sometext}')
    2. update 'table' set GroupById = id where GroupById = null - 它可能是 0 而不是 null,具体取决于您在 db 中插入的内容。

    你总是可以通过索引、限制、顺序来优化它。

    【讨论】:

    • 我很想在 WHERE 子句中使用最后一个 insert_id,因为可能有一百万行要查找 WHERE GroupById IS NULL。
    • 如果你在每次插入时都这样做,这不是问题,而且我提到应该优化查询
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2015-10-04
    • 2019-06-18
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多