设置主键`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

学习

【问题讨论】:

这被标记为mysqlsql 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 子句在这种情况下是多余的(无论如何,您不会得到任何不存在 ids 的行,因此没有必要将它们过滤掉) @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`的主要内容,如果未能解决你的问题,请参考以下文章

设置主键`id`

Mybatis在insert时返回主键id

如何设置主键自增从1000开始每次自增1

sql 设置主键 自动增长

JPA 自动建表- @Id,@GeneratedValue 与 @GenericGenerator 设置主键生成策略

MySql 设置ID主键自增,从0开始,请问怎么设?