这样的事情可能吗?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
Run Code Online (Sandbox Code Playgroud)
比如使用返回值作为值来在第二个表中插入一行并引用第一个表?
我有点诙谐的问题.比如说,我在一个存在主键的表中插入了一些包含一些数据的行.如何"选择"刚刚插入的行的主键?
我应该更具体,并提到我目前正在使用SQLite.
我想我理解PostgreSQL和RETURNING是如何工作的 - 我发现了许多很多资源.如果我抓住它,它会看起来像
"INSERT INTO table (column2, column3) VALUES ('value1', 'value2') RETURNING id;"
Run Code Online (Sandbox Code Playgroud)
但是,我找不到任何可以帮助我通过PHP访问它的东西.当我以为我想出来的时候,我试过了
$new_id = pg_query($dbc, "INSERT INTO table (column2, column3) ".
"VALUES ('value1', 'value2') RETURNING id;");
return $new_id;
Run Code Online (Sandbox Code Playgroud)
但它返回NULL.我还尝试用一个查询分别执行和声明变量.在寻找解决方案的几个小时后,我已经确定了一个max(id)SELECT语句/函数,但它仍然困扰着我.任何帮助是极大的赞赏.
我正在使用Postgres 8.4和PHP 5.3.
我目前正在玩Liquibase并为用户创建了一个表,并为角色创建了一个表.每个用户都有一个唯一的id,当插入用户时,该ID是自动生成的(通过自动增量序列).然后,角色表中的角色将引用此ID.
现在我尝试使用Liquibase插入默认用户.首先我插入用户,然后我想插入一个引用这个新创建的用户的角色.
问题是我无法在Liquibase中找到一种方法来检索为新用户生成的id,以便在插入新角色时可以使用它.
这可能吗?如果是,应该怎么做?
想要做以下事情:
<insert tableName="xxx_user">
<!-- Id is auto incremented -->
<column name="user_name" value="XXX" />
<column name="password" value="XXX" />
<column name="first_name" value="XXX" />
<column name="last_name" value="XXX" />
</insert>
<insert tableName="user_role">
<column name="user_id" value="<point at the auto generated id in previous insert>" />
<column name="role" value="A_ROLE" />
</insert>
Run Code Online (Sandbox Code Playgroud) 我正在使用 IntelliJ 和数据库工具。我对一些数据有疑问,所以我删除了一行,但后来想添加更多......
我使用了克隆选项:
然后我修改了我的值并点击了commit按钮。
但是,插入失败并出现错误:
错误:重复的键值违反了唯一约束“主键 some_table”详细信息:键(id)=(58)已存在。
然后我尝试通过控制台并手动插入,但出现相同的错误。每次我执行此操作时,id 都会递增...我有数千条记录,因此我无法继续单击,直到我的手指折断。
如下所示id(创建表时):
id bigserial not null constraint "Primary Key some_table"
primary key
Run Code Online (Sandbox Code Playgroud)
当我尝试修改表时,我看到 id 的默认值设置如下:
nextval('some_table_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
我试过了:
INSERT INTO some_table (id,...columns..) VALUES (DEFAULT,...columns...);
Run Code Online (Sandbox Code Playgroud)
和
INSERT INTO some_table (...columns..) VALUES (...columns...);
Run Code Online (Sandbox Code Playgroud)
但我得到同样的错误...
我意识到我可以做一些事情,比如运行查询来获取 MAX id,然后进行插入,但这对我来说似乎有点荒谬。
如何定制我的INSERT以便它自动获取新的/下一个id?
例如,MSSQL 已使用newid().
我正在使用 Postgres。我有一张旧桌子和一张新桌子。旧表中的记录需要有新表中的相关记录。新表记录将有效地充当新表中记录的父项。
我正在尝试编写一个迁移,其中旧表中的每个“子”在新表中都有“父”。
OLD TABLE(我添加了一个外键,希望在迁移过程中填充它)
id | name | new_id (FK)
----+------+-------------
1 | 1st |
2 | 2nd |
Run Code Online (Sandbox Code Playgroud)
新表
id | name
----+------
|
Run Code Online (Sandbox Code Playgroud)
我需要执行以下操作:
SELECT 旧表中的所有记录INSERT 每个旧记录的新表中的记录和 RETURNING idUPDATE 旧记录的外键值 RETURNING id有没有办法使用集合查询来完成此操作?或者我是否需要开始深入研究 Postgres 特定的东西,比如LOOPs?
这是一个完成标题的例子,这是我的函数的内部(我使用postgresql,但我想这是纯SQL语言)
$$
INSERT INTO foo VALUES (DEFAULT, $1) RETURNING id;
INSERT INTO link_foo_to_bar VALUES (1, <?>);
$$ language SQL;
Run Code Online (Sandbox Code Playgroud)
这里要注意两件事,我返回第一个插入的id,如何捕获它以使用返回的id作为第二个插入的第二个参数标记为<?> ?
我有一个表,其行“id”(主键)默认设置为 PostgreSQL 中的串行。我通过调用插入到这一行
session.getCurrentSession().createSQLQuery("some insert query")
Run Code Online (Sandbox Code Playgroud)
没有在 id 中添加任何值,因为它默认设置为串行。
如何检索刚刚插入的行的“id”?