0

可能重复:
MySQL 触发器将字段更新为 id 的值

请我有一个包含三个字段的表:

Id (auto increment)
GroupById
Text

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

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

编辑:我的代码:

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

5 回答 5

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 $$

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

于 2012-12-12T23:37:27.843 回答
1

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

INSERT INTO myTable (GroupById, Text) VALUES (NULL, 'your text');
SET @lastID = LAST_INSERT_ID();
UPDATE myTable SET GroupById = @lastID WHERE Id = @lastID;
于 2012-12-13T00:08:26.537 回答
0

使用存储过程

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

您可以在单个事务中获得所需的结果。

希望这可以帮助。

于 2012-12-12T23:55:11.333 回答
0

使用此功能| 经过测试

使用示例:

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; }
于 2012-12-13T01:18:17.803 回答
0

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

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

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

于 2012-12-12T22:46:19.807 回答