我有一张桌子
Pattern p = Pattern.compile("name: '([^']*)'");
lines.map(p::matcher)
.filter(Matcher::matches)
.findFirst()
.ifPresent(matcher -> System.out.println(matcher.group(1)));
其中id | entry | field | value
1 | 1 | name | Egon
2 | 1 | sname | Smith
3 | 1 | city | Los Angeles
4 | 2 | name | Stephe
5 | 2 | sname | Mueller
6 | 2 | city | New York
是PK和自动增量。具有相同id
的行属于一起,它们是一种数据集。我想为新的entry
添加新行(其值应为3)。
我的问题是:如何以某种方式获取entry
的下一个值,它是唯一的?
目前我正在使用像
entry
但是当同时进行两次查询时,我会得到SELECT MAX(entry)+1
两个查询。我用PHP编码。
答案 0 :(得分:0)
你可以做一些循环,每个循环增加一个条目。如果要添加具有相同条目的更多行,请在1循环中向其传递更多参数。
class foo{
protected $foo = [];
public function set_foo($arguments = []){
$this->foo = $arguments;
}
public function insert_rows(){
$entry = // last entry from the db (number)- your logic here
$num_of_foos = count($this->foo);
$i = 0;
$query = 'INSERT INTO table(entry, field, value ) VALUES';
while($i<$num_of_foos){
if($i>1){$query .= ',';} // adds the comma if loop repeats more than once
$query .= '("';
$query .= $entry; // entry number for the first item
$query .= ',' . $this->foo[$i] . ',' . $some_Value;
$query .= '")';
$i++;
} // end of while loop
$entry++;
} // end of function insert_rows()
} // end of class foo
//now all you need to do is set the foo
$foo = new foo;
$foo->set_foo('lalala'); // sets one argument with new entry
$foo->set_foo('jajaja'); // sets another argument with new entry
$foo->set_foo('lala', 'jaja'); // sets two arguments with the same entry
答案 1 :(得分:0)
使用您在INSERT中作为唯一标识符获得的序列(不要将此任务留给PHP):
INSERT INTO "my_table" ("entry", "field", "value") VALUES (currval(('"my_current_id_sequence"'::text)::regclass), 'any_field_info', 'any_value_info');
这样postgres将使用正确的数字EVERYTIME。
另一个方法是创建一个序列并在INSERT上使用它,只需使用nextval(('"my_new_sequence"'::text)::regclass)
作为entry
的值,你甚至可以将它用作默认值。
如果您需要知道使用了哪个值,只需将RETURNING entry
添加到INSERT
CREATE SEQUENCE alt_serial START 101;
ALTER TABLE "my_table"
ALTER COLUMN "entry" SET DEFAULT nextval(('"alt_serial"'::text)::regclass);
INSERT INTO "my_table" ("entry", "field", "value") VALUES (DEFAULT, 'any_field_info', 'any_value_info') RETURNING entry;
答案 2 :(得分:0)
你需要:
创建序列
CREATE SEQUENCE table_entry_seq;
然后,当您需要添加一个包含新entry
的行时,请获取序列的下一个值:
SELECT nextval(('"table_entry_seq"'::text)::regclass)