我有一个表,其中有一列名为article_title
. 假设表名是articles
. 我需要找出多个记录中article_title
数据相同的记录。
这是我所拥有的:
select a.*
from articles a
where a.article_title = (select article_title
from articles
where article_title = a.article_title
AND a.id <> articles.id)
Run Code Online (Sandbox Code Playgroud) 此问题与使用 PostgreSQL 9.2 或更高版本忽略重复插入有关。我问的原因是因为这段代码:
-- Ignores duplicates.
INSERT INTO
db_table (tbl_column_1, tbl_column_2)
VALUES (
SELECT
unnseted_column,
param_association
FROM
unnest( param_array_ids ) AS unnested_column
);
Run Code Online (Sandbox Code Playgroud)
代码不受检查现有值的影响。(在这种特殊情况下,用户并不关心插入重复项的错误——插入应该“正常工作”。)在这种情况下添加代码来显式测试重复项会带来复杂性。
在 PostgreSQL 中,我找到了几种忽略重复插入的方法。
创建一个捕获唯一约束违规的事务,不采取任何行动:
BEGIN
INSERT INTO db_table (tbl_column) VALUES (v_tbl_column);
EXCEPTION WHEN unique_violation THEN
-- Ignore duplicate inserts.
END;
Run Code Online (Sandbox Code Playgroud)
创建规则以忽略给定表上的重复项:
CREATE OR REPLACE RULE db_table_ignore_duplicate_inserts AS
ON INSERT TO db_table
WHERE (EXISTS ( SELECT 1
FROM db_table
WHERE db_table.tbl_column = NEW.tbl_column)) DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)
我的问题主要是学术性的:
这已经在 Stack Overflow 上问过了,但仅限于 MySQL。我正在使用 PostgreSQL。不幸的是(而且令人惊讶的是)PostgreSQL 似乎没有像CHECKSUM table
.
PostgreSQL 解决方案会很好,但通用的解决方案会更好。我找到了http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data,但我不明白使用的逻辑。
背景:我重新编写了一些数据库生成代码,所以我需要检查新旧代码是否产生相同的结果。
我正在使用带有 PtokaX API 的 LuaSQL 插入到下表中。
CREATE TABLE `requests` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ctg` VARCHAR(15) NOT NULL,
`msg` VARCHAR(250) NOT NULL,
`nick` VARCHAR(32) NOT NULL,
`filled` ENUM('Y','N') NOT NULL DEFAULT 'N',
`dated` DATETIME NOT NULL,
`filldate` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `nick_msg` (`nick`, `msg`),
UNIQUE INDEX `ctg_msg` (`ctg`, `msg`)
)
COMMENT='Requests from users in any of the categories.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,当用户(由 表示nick
)尝试再次插入相同的请求时,UNIQUE
会检查索引并且脚本返回 false。这会导致我的脚本失败,我必须重新启动脚本。
有什么我可以在
INSERT ... ON DUPLICATE KEY …
我在列a
和b
. 我需要这样的东西:
insert into my_table (a, b) values (1, 2), (1, 2)
on conflict (a) do update set c = 'a_violation'
on conflict (b) do update set c = 'b_violation'
Run Code Online (Sandbox Code Playgroud)
所以一般我想根据冲突目标进行不同的更新 - 不支持上面的语法(只支持一个on conflict
语句)。有没有其他方法可以做到这一点?
我有一个托管在 SQL Azure 实例上的 OLTP 数据库。我想从云中提取数据库的副本,以便我可以对其运行一些大量提取和 OLAP 样式的查询,而不会影响源数据库。
如何将数据库的副本下拉到本地 SQL Server 实例?
我发现自己写了以下内容:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
Run Code Online (Sandbox Code Playgroud)
并想知道是否有更简洁的方法而不牺牲太多的可读性。
我找到了一种作为答案发布的方法,但我对此并不完全满意,并且对替代方案非常感兴趣
在这种情况下val
是唯一的foo
- 没有重复
我有一个表,其架构如下:
create_table "questions_tags", :id => false, :force => true do |t|
t.integer "question_id"
t.integer "tag_id"
end
add_index "questions_tags", ["question_id"], :name => "index_questions_tags_on_question_id"
add_index "questions_tags", ["tag_id"], :name => "index_questions_tags_on_tag_id"
Run Code Online (Sandbox Code Playgroud)
我想删除重复的记录,即它们既具有相同的记录tag_id
又question_id
与另一条记录相同。
SQL 看起来像什么?
我的数据库(PostgreSQL 9.3)的一部分依赖于额外的表(例如 County、City、Town...)。我不管理这些表,它们由第三方定期更新。每次我得到一个新的完整转储,但我很难将更改推回我的数据库。
我玩过 pg_dump / restore 并遇到了一些约束问题duplicate key value violates unique constraint
,cannot drop constraint ... because other objects depend on it
甚至使用--disable-triggers
or--clean
选项。
有没有我错过的选项?我发现有一些方法可以打开/关闭约束,但我不知道这是解决这个问题的好方法还是只是一个肮脏的黑客?(我不是 DBA 专家。)老实说,我很惊讶没有简单的方法来实现这一目标。也许我已经错过了!我天真地认为我可以将 pg_restore 作为一个大事务运行并在脚本末尾检查约束。是否可以?
名为 的相关表emp
包含以下数据:
CREATE TEMPORARY TABLE emp AS
SELECT * FROM ( VALUES (1,'A'), (2,'B'), (3,'C') );
ID Name
-- ----
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
数据操作操作的输出或结果集应如下所示:
ID Name
-- ----
1 A
1 A
2 B
2 B
3 C
3 C
Run Code Online (Sandbox Code Playgroud)
必须获得符合以下条件的输出:
注意:这个场景是一个面试官给我带来的。
duplication ×10
postgresql ×6
insert ×2
mysql ×2
backup ×1
constraint ×1
restore ×1
update ×1
upsert ×1