在postgres中创建新的唯一ID

时间:2016-01-14 13:47:13

标签: php postgresql

我有一张桌子

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编码。

3 个答案:

答案 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)