小编hvi*_*ard的帖子

为什么更改表并添加外键会创建额外的约束?

编辑:这是一个默认约束,因为在添加列时设置了默认值。当以“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 时,我必须删除外键约束 - 这很容易,因为我命名了它,但是另一个系统生成的约束仍然存在,我没有直接删除的方法它。

是否可以在系统不生成第二个(我假设是冗余的)约束的情况下将外键添加到现有表中?

foreign-key sql-server sql-server-2008-r2 alter-table

5
推荐指数
1
解决办法
4260
查看次数

PostgreSQL 不使用索引

我有一个非常简单的表:

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)

postgresql

5
推荐指数
2
解决办法
1557
查看次数