设置主键`id`
Posted
技术标签:
【中文标题】设置主键`id`【英文标题】:set primary key `id` 【发布时间】:2011-10-24 03:17:30 【问题描述】:表:
ProductComapny
字段:id
,name
ProductComapny
内容 10000 记录。
现在我想要id
设置主键但是已经重复了许多id
录音
1.id
怎么设置主键???
2.如何删除重复记录?
3.如何获取重复记录的数量?
在 SqlServer 和 mysql 中使用 SQL
学习
【问题讨论】:
这被标记为mysql
和sql server
。 这是什么?
sql sql sql sql sql 不管是sql server还是mysql
@JNK - 哈哈,好地方。 @ashkufarax - 这很重要,MySQL 和 SQL Server 有不同的操作可供彼此使用;他们以不同的方式,用不同的语法做不同的事情。例如,我的答案在 MySQL 中不起作用。
-1 for no matter sql server or mysql
- 实际上确实如果你想要一个正确的答案。
在sql server amd mysql中学习
【参考方案1】:
回答SQL Server
- 这在MySQL
中不起作用。请指定哪些人,而不是光顾能够帮助您的人。
获取重复次数:
SELECT id, name, COUNT(*) FROM productCompany GROUP BY id, name
要应用主键,首先删除重复项,如下所示:
WITH sorted AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY id, name) AS duplicate_id,
id,
name
FROM
productCompany
)
DELETE
sorted
WHERE
duplicate_id > 1
然后使用 Management Studio 应用您的主键。
【讨论】:
如何获取重复记录数? 我意识到问题被标记为 SQL Server 和 MySQL。请注意,这里没有 MySQL 中的窗口函数 (ROW_NUMBER() OVER...
)。【参考方案2】:
3.如何获取重复记录的数量?
SELECT id, COUNT(*)
FROM ProductCompany
GROUP BY id
HAVING COUNT(*) > 1
2.如何去除重复记录?
你会如何选择保留哪一个?
【讨论】:
HAVING
子句在这种情况下是多余的(无论如何,您不会得到任何不存在 id
s 的行,因此没有必要将它们过滤掉)
@Piskvor :它说> 1
而不是> 0
。这意味着存在但无重复项的记录不会包含在 Joe 的结果中。
@Piskvor:HAVING
子句过滤掉 ID 仅出现一次因此不重复的实例。
啊,是的 - 我一直在想“这个特定的 ID 在数据库中有多少次?”并且没有捕捉到“非重复”的 ID。【参考方案3】:
如果您的问题是关于 MySQL 的,那么可以这样做:
ad 3: SELECT COUNT(*),id FROM ProductComapny GROUP BY id
将为您提供数据库中每个 id 的出现次数(顺便说一句“ProductCom ap ny”?)
广告 2:这取决于您的业务逻辑 - 您想保留哪个?
广告 1:ALTER TABLE ProductComapny ADD PRIMARY KEY(id);
(是的,MySQL/MSSQL 的区别很重要:IIRC 以上都不是 MSSQL 中的有效代码)
【讨论】:
我认为您的查询是有效的 TSQL @JNK:我不确定 SELECT 查询中是否混合了组函数和非组字段;这曾经是 MySQL 独有的怪癖。可能它现在在 TSQL 中实现了? (IDK) @Piskovr - 在 TSQL 中始终允许只要您按非聚合字段分组。 Mysql 允许SELECT col1, col2, COUNT(*) from table GROUP BY col1
而 TSQL 不允许。
@JNK:啊哈!谢谢你的解释:)【参考方案4】:
如果你强制 mysql 添加一个主键,它将删除所有重复项以便能够成功,你可以强制替换一个带有关键字 ignore 的表,即忽略警告。
ALTER IGNORE TABLE ProductComapny ADD PRIMARY KEY (id);
【讨论】:
【参考方案5】:删除重复条目的一种方法是将它们复制到临时表中,从主表中删除所有重复项,将数据从临时表复制到主表。
插入临时表 选择 ID、名称 来自 ProductCompany 按 ID、名称分组 计数(*) > 1
从 ProductCompany 中删除 id 在哪里(从 TempTable 中选择 id)
插入产品公司 选择 ID、名称 来自临时表
这应该可行。 之后,您可以在 ID 字段上设置主键,因为不会再有重复项。
【讨论】:
以上是关于设置主键`id`的主要内容,如果未能解决你的问题,请参考以下文章