假设我有一个名为 的表people
,其中id
是主键:
+-----------+---------+---------+
| id | fname | lname |
| (integer) | (text) | (text) |
+===========+=========+=========+
| 1 | Daniel | Edwards |
| 2 | Fred | Holt |
| 3 | Henry | Smith |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。
我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:
INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加一age
列,则需要修改查询以同时考虑年龄列。
显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint
-- 而且,无论如何我都不希望它们共享相同的 ID:
INSERT INTO people …
Run Code Online (Sandbox Code Playgroud) 我刚刚在我的笔记本电脑上创建了一个 PostgreSQL 数据库(按照这些说明),它运行的是 Linux CentOS 7。
现在我想了解我的默认数据库的主机名地址是什么。我以为是,localhost
但不是。
我想知道要与psql -h
命令一起使用的名称或 IP 地址。基本上,运行此psql -h HOSTNAME
命令应该让我psql
单独获得与该命令相同的结果,即让我连接到我的数据库。
我的默认数据库的主机名地址是什么?
Run Code Online (Sandbox Code Playgroud)> service postgresql status
状态:
? postgresql.service - PostgreSQL 数据库服务器已加载:已加载(/usr/lib/systemd/system/postgresql.service;已启用;供应商预设:已禁用)活动:自 2017 年 3 月 30 日星期四 14:40:30 EDT 起处于活动状态(正在运行) ; 1 天 1 小时前主 PID: 2256 (postgres
而两者psql -h 127.0.0.1
并psql -h 127.0.0.1 -U davide
产生此消息:
psql:致命:用户“david”的身份验证失败`
有时在具有多列的表中插入数据时,如果插入语句不应该失败,知道必须指定哪些列会很有用。
我写了这个查询来找出哪些列不可为空、标识、计算、时间戳和没有默认值。
select *
from sys.columns
where object_id = object_id('<table>') and
is_nullable = 0 and
is_identity = 0 and
is_computed = 0 and
default_object_id = 0 and
type_name(system_type_id) <> 'timestamp'
Run Code Online (Sandbox Code Playgroud)
此检查中是否应包含任何其他属性?
在 SQL Server 中工作,假设我有一个包含两个表的数据库:events
和competitors
.
events
有以下列:
[event_id] [event_name] [winner_id] [loser_id]
Run Code Online (Sandbox Code Playgroud)
competitors
有以下列:
[comp_id] [comp_name]
Run Code Online (Sandbox Code Playgroud)
我想添加一个默认约束以[event_name]
在插入新事件时节省我的时间。类似于:
ALTER TABLE [events]
ADD CONSTRAINT DF_event_name
DEFAULT CAST([winner_id] AS varchar(10)) + ' vs ' + CAST([loser_id] AS varchar(10)) FOR [event_name]
Run Code Online (Sandbox Code Playgroud)
当然,这是一个简化版本,它还需要使用competitors ON comp_id = winner_id and comp_id = loser_id
.
当我尝试设置上述默认约束时,我得到了您可能期望的响应:
在此上下文中不允许使用名称“winner_id”。有效的表达式是常量、常量表达式和(在某些上下文中)变量。不允许使用列名。
那么有什么办法可以解决我想要做的事情吗?
有没有办法自动将单元格的值设置为实现从同一行插入的数据的字符串?如果可能的话,是否也可以使用 join 语句来完成?我的下一个想法是触发器。
在 mysql 5.7.28 中我创建了一个像这样的表:
create table t1 (
id int not null,
d1 timestamp)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
它工作正常并创建d1
为, 。non-null
default value current_timetamp
on update current_timestamp
但是当我尝试创建具有两个时间戳字段的相同表时,如下所示:
create table t1 (
id int not null,
d1 timestamp,
d2 timestamp)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
SQL 错误 (1067):“d2”的默认值无效
为什么只有在添加第二个时间戳字段时才会出现错误?
这是 mysql 中的错误还是某些预期行为?
我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Run Code Online (Sandbox Code Playgroud)
我知道添加具有默认值的新列是安全的。但是,与 组合使用仍然安全吗NOT NULL
?或者它会锁定数据库吗?谢谢!
我有一种情况,许多用户可以跨所有可用模式创建数据库对象。
所有开发人员都使用一个通用用户 pg_dump_user 在需要时将整个数据库转储到他们的本地数据库。所以这个用户应该拥有对所有数据库对象的读取权限。
为了实现这一点,我尝试在架构级别和用户级别设置默认权限。
--为每个模式设置的默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA xyz GRANT SELECT ON TABLES to ro_user';
Run Code Online (Sandbox Code Playgroud)
--为每个用户设置的默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE abc_user GRANT SELECT ON TABLES to ro_user' ;
Run Code Online (Sandbox Code Playgroud)
即使上面的设置存在,在某些时间之后这些都会消失,因为 ro_user 无法访问创建的新对象。
任何关于此的指针都会有所帮助,我的目标只是为用户实现对当前和未来所有对象的选择访问,以便执行 pg_dump。
我的兴趣是用 FSP 为 6 来存储时间。正如我所读到的,这不能用TIMESTAMP
orDATETIME
数据类型来实现。所以,我有一个double
字段来存储microtime
函数的输出。
无论如何我可以为这样的字段设置(甚至编写一些代码来创建)默认值吗?
我想使用类似的东西NOW(6)
并获取1442059062.065123
例如。
在设置使用随机 UUID 作为主键的数据库的脚本中,我有:
CREATE TABLE alpha (id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), value INT);
CREATE TABLE beta (aref UUID REFERENCES alpha (id));
INSERT INTO alpha (value) VALUES (42);
Run Code Online (Sandbox Code Playgroud)
然后通过外键,让“alpha”中的记录成为插入“beta”表的默认目标:
DO $$
DECLARE l_id UUID;
BEGIN
SELECT alpha.id FROM alpha INTO l_id;
ALTER TABLE beta ALTER COLUMN aref SET DEFAULT l_id;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: column "l_id" does not exist CONTEXT: SQL statement "ALTER TABLE beta ALTER COLUMN aref SET DEFAULT l_id" PL/pgSQL function inline_code_block line 1 at SQL statement …
我有一个 PostgreSQL 数据库,其中有很多相同结构的表,总共 36 列:
CREATE TABLE some_schema.some_table (
id integer NOT NULL DEFAULT nextval('some_schema.id_seq'::regclass),
col2,
col3,
col4,
[...],
col35,
mi_prinx integer NOT NULL DEFAULT nextval('some_schema.mi_prinx_seq'::regclass),
CONSTRAINT some_table_pkey PRIMARY KEY (mi_prinx)
)
Run Code Online (Sandbox Code Playgroud)
在许多情况下,我必须从具有相同结构的另一个表中插入记录:
INSERT INTO some_schema.some_table (col2,col3...col35)
SELECT col2,col3...col35
FROM some_schema.another_table_with_same_structure;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以做到这一点,而不必列出所有没有默认值的列?我想我可以以某种方式使用,但我无法根据文档DEFAULT VALUES
获得正确的语法。
default-value ×10
postgresql ×6
alter-table ×2
dynamic-sql ×2
insert ×2
mysql ×2
sql-server ×2
timestamp ×2
address ×1
cast ×1
datetime ×1
join ×1
mysql-5.7 ×1
null ×1
permissions ×1
plpgsql ×1
subquery ×1