我有这张表relations
ID Name Parent Pos
================================
1 Alex 1 1
2 Mary 1 2
3 John 1 3
4 Doe 2 1
5 Bob 2 2
6 Kate 2 3
在我执行insert
查询之前,我选择Parent
ID并获取最后Pos
位置,然后按1递增。
$data = $DB2->query("SELECT * FROM relations
WHERE Parent='1' ORDER BY `Pos` DESC LIMIT 1");
$results = $data->result_array();
foreach($results as $row) {
$pos = $row['Pos']; //last position
}
$pos = $pos + 1;
$DB2->query("INSERT IGNORE INTO relations (Name,Parent,Pos) VALUES('test',1,'$pos')");
有没有办法可以自动增加每个Pos
列的Parent
列?或者我目前的方式效率最高?
答案 0 :(得分:1)
如果您不担心竞争条件(同时发生两次插入),那么您可以在一个声明中执行此操作:
INSERT IGNORE INTO relations (Name, Parent, Pos)
SELECT 'test', 1, MAX(pos) + 1
FROM relations
WHERE Parent = 1;
但是,我肯定会建议您在(Parent, Pos)
上添加唯一索引,并删除IGNORE
- 如果发生错误,您想了解它。
您可以使用触发器进行分配,从而使此更安全。您还可以锁定表,以便在特定插入期间不会发生其他插入。这是一项昂贵的操作,如果交易负载很重,可能会降低系统速度。