我是 PostgreSQL 的新手,这就是我问这个问题的原因。我有一个表app_client_users和一个名为client_id. 最初我将其设置为NOT NULL,现在我想将其更改为允许 NULL。我试过了
alter table app_client_users alter column client_id int NULL ;
Run Code Online (Sandbox Code Playgroud)
和
alter table app_client_users alter column client_id NULL ;
Run Code Online (Sandbox Code Playgroud)
这是行不通的。我该如何解决?
我在 SQL Server (Azure) 中有一个包含 140 万行的表。
我想索引其中一列;但是,它的数据类型是nvarchar(max)(通过使用我想象的 EF 默认为这样)。我正在使用实体框架,并且可以进行迁移,将此数据类型更改为nvarchar(50).
我担心这需要多长时间,以及是否会导致锁定问题。我只扩展过列,所以我不确定会发生什么。我确实知道此列中的数据适合新尺寸。
我正计划创建数据库的副本并尝试一下。我也考虑过迁移到一个新列,但如果不是太痛苦,我更愿意更新当前列。
我有一个包含一些行的表,我尝试使用以下命令添加一个标识列:
ALTER TABLE sourceTable
ADD COLUMN ogc_fid int
GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)
建议使用上面的命令来回答这个问题:
但我得到:
错误:“ogc_fid”列包含空值
SQL 状态:23502
看起来表的现有行没有自动生成标识,但会导致此错误(如果表没有行,该命令可以正常工作)。有任何想法吗?我是否必须首先为我添加的列生成值DEFAULT nextval('some_sequence')?或者在 PostgreSQL 10 中有更好的方法吗?
我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Run Code Online (Sandbox Code Playgroud)
我知道添加具有默认值的新列是安全的。但是,与 组合使用仍然安全吗NOT NULL?或者它会锁定数据库吗?谢谢!
我做了这个查询:ALTER TABLE dbname.tablename DROP COLUMN columnname它已经运行了几个小时,我想知道它还需要多长时间。
大约有 750m 行。
谢谢 !
如果您需要更多详细信息,我会提供给他们,我不想提供那些没有用的信息
我有类型为列的表NTEXT。并且由于某些特殊原因,客户端希望将列类型迁移到NVARCHAR(MAX).
这样做时,我应该注意哪些潜在威胁?
限制是否有数据丢失的可能性NVARCHAR(MAX)?
我正在将 MySQL 表从 MyISAM 切换到 InnoDB,并且在我手动执行之前,我不希望从服务器执行更改表命令。目的是备份几个小时,以防出现我尚未解决的问题。有没有办法告诉 MySQL slave 在一段时间内不要处理来自 Master 的 alter table 命令?
我需要旋转(使用 DROP 和 CREATE)一个被其他客户端大量使用的表。
目前,我有一个程序可以替换(DROP + CREATE)这个表。
有时,就在表被替换后,我从访问表的并发客户端收到“错误:无法打开与 OID xyz 的关系”。
可以说这种行为打破了事务隔离......是吗?
我知道这是由 postgres 后端缓存的系统目录引起的(这通常是一件好事)。我是对的吗?
有什么方法可以强制后端“忘记”表 OID(DISCARD没有帮助)?
我知道如果我切换到“DELETE and INSERT”模式而不是“DROP and CREATE”模式会有所帮助。但这是一些遗留程序,除非绝对需要,否则我们不想更改它。
对于如何摆脱这个问题的任何建议,我将不胜感激。
目标是为其他客户端透明地旋转表格。
这是我将问题简化为的最小测试用例:
A. 这是客户端(多个客户端将并行运行此 SELECT)。我们将使用pgbench来强调数据库。
$ echo "SELECT num FROM x;" > pgbench.minimal.sql
Run Code Online (Sandbox Code Playgroud)
B. 这是“旋转器”。
$ cat > rotate.x.sql <<EOF
BEGIN;
DROP TABLE x;
CREATE TABLE x ( num integer );
COMMIT;
EOF
Run Code Online (Sandbox Code Playgroud)
C.创建空数据库和表x。
$ createdb dev
$ psql dev -c "CREATE TABLE x ( num integer )"
Run Code Online (Sandbox Code Playgroud)
D. 启动 30 …
编辑:这是一个默认约束,因为在添加列时设置了默认值。当以“DF__”开头时,这个名字就泄露了它。无论如何,通过添加列并手动命名约束来解决它。
ALTER TABLE MyTable ADD [FooId] [int] NOT NULL CONSTRAINT DF_MyTable_FooId DEFAULT 0
Run Code Online (Sandbox Code Playgroud)
现在我可以轻松删除约束并删除列。
出于测试目的,我需要经常删除并重新创建一些表。我正在使用 MS-Sql 服务器 2008 r2。
当我创建表时,我还在现有表中创建了一个外键(我不能直接删除):
ALTER TABLE MyTable
ADD CONSTRAINT FK_MyTable_NewTable
FOREIGN KEY (FooId) REFERENCES NewTable (Id)
Run Code Online (Sandbox Code Playgroud)
这确实正确创建了外键,但它还添加了一个带有系统生成名称的约束(类似于 DF__MyTable_FooId__53385258),如果在 CREATE TABLE 语句中定义了外键,则不会创建。
我的问题是,当我想删除 MyTable 时,我必须删除外键约束 - 这很容易,因为我命名了它,但是另一个系统生成的约束仍然存在,我没有直接删除的方法它。
是否可以在系统不生成第二个(我假设是冗余的)约束的情况下将外键添加到现有表中?
我有一个分区表:SAMPLE_PARTITIONED_TBL基于PERIOD_ID数字字段(数据集:201001...201212.. 等等)有 60 个分区(没有子分区)。该表有几个本地索引,但由于某种原因,问题出在 PK 索引上。我在另一个模式中有相同的 DDL,它在那里工作正常。不确定 tio 寻找什么来解决这个问题。
我正在使用 Informatica(ETL 工具)将数据加载到该表中。在加载之前,我们会截断分区表:
SQL> ALTER TABLE owner_name.SAMPLE_PARTITIONED_TBL
2 TRUNCATE PARTITION SMPL_201001 DROP STORAGE;
Run Code Online (Sandbox Code Playgroud)
当加载开始时,我收到以下错误:
Message: Database errors occurred:
ORA-01502: index 'owner_name.SAMPLE_PARTITIONED_TBL_PK' or
partition of such index is in unusable state
Run Code Online (Sandbox Code Playgroud)
查看索引的状态...
SQL> select STATUS from all_indexes
2 where INDEX_NAME like 'SAMPLE_PARTITIONED_TBL_PK';
STATUS
--------
UNUSABLE
Run Code Online (Sandbox Code Playgroud)
现在在执行SQL> ALTER INDEX owner_name.SAMPLE_PARTITIONED_TBL_PK REBUILD;本地分区索引返回STATUS=VALID状态后,加载可以继续没有问题。
更新:
根据下面@Mat 的观察,我正在检查 PK 索引是否在本地分区:
SQL> select * from all_indexes where table_name = 'SAMPLE_PARTITIONED_TBL'; …Run Code Online (Sandbox Code Playgroud) alter-table ×10
postgresql ×4
sql-server ×3
datatypes ×2
mysql ×2
null ×2
partitioning ×2
foreign-key ×1
identity ×1
index ×1
oracle-11g ×1
replication ×1
transaction ×1
truncate ×1