编辑:这是一个默认约束,因为在添加列时设置了默认值。当以“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 时,我必须删除外键约束 - 这很容易,因为我命名了它,但是另一个系统生成的约束仍然存在,我没有直接删除的方法它。
是否可以在系统不生成第二个(我假设是冗余的)约束的情况下将外键添加到现有表中?
我有一个非常简单的表:
CREATE TABLE content
(
id serial NOT NULL,
text text,
fullfilename text,
CONSTRAINT "PK_ID" PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE content
OWNER TO postgres;
CREATE INDEX content_idx
ON content
USING gin
(to_tsvector('danish'::regconfig, text));
Run Code Online (Sandbox Code Playgroud)
哪里text
是一个相当长的聚合文本来执行全文搜索。
当我运行以下查询时,它求助于 seq 扫描:
EXPLAIN ANALYZE SELECT id
FROM content
WHERE to_tsvector('danish', text) @@ to_tsquery('danish','felter')
"Seq Scan on content (cost=0.00..164.57 rows=249 width=4) (actual time=41.147..7235.823 rows=289 loops=1)"
" Filter: (to_tsvector('danish'::regconfig, text) @@ '''felt'''::tsquery)"
" Rows Removed by Filter: 1149"
"Planning time: …
Run Code Online (Sandbox Code Playgroud)