自動增長標籤列和此表另一主鍵(有重復值)的問題

maoyesky 2009-04-22 04:43:16
--我有個表有多個字段
create table sto_outstock(a1 int identity(1,1),a2 nvarchar(12),a3 nvarchar(20),a4 nvarchar(30))
ALTER TABLE [dbo].[sto_outstock] WITH NOCHECK ADD
CONSTRAINT [PK_sto_outstock] PRIMARY KEY CLUSTERED
(
[a2]
) ON [PRIMARY]
Go
ALTER TABLE [dbo].[sto_outstock] ADD
CONSTRAINT [DF_sto_outstock_a2] DEFAULT ([dbo].[get_outstock_id_year](getdate(), 9)) FOR [a2]
GO
/*
a1 int identity(1,1) ---標識列,自動增長的,增量為1
a2 nvarchar(12) --- 是主鍵
a3 nvarchar(20)
a4 nvarchar(30)

a1是用預設值調用一個函數得來的,,
*/

CREATE Function get_outstock_id(@date datetime)
returns varchar(12)
as
begin
Declare @id varchar(12)
Declare @maxnum varchar(6)
Select @id = right(convert(varchar(8),@date,112),5)
Select @maxnum = isnull(max(right(ckid,6)),'0') from sto_outstock
where ckid like @id + '%'
Select @maxnum = right('000000' + convert(varchar(6),
convert(int,@maxnum) + 1) ,6)
return @id + '-' + @maxnum
End

--用了几年,今天查此表中的數據,發現a2有相同的,不知道你們有沒有發生過此類似情況!
...全文
140 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
maoyesky 2009-04-23
  • 打赏
  • 举报
回复
謝謝各位的回復!!

****不是的,我的表結構是不會變的.是有主键的,主键的也沒有取消過,我是3個月前發現此問題,數據已把重复记录進行處理過(修改成不重复),現在新的記錄中又有了20多條.總新增加的記錄100多萬行!!!***** 我今天去檢查表結構后發現主键真的沒有了. 變成了索引.



acmilan1984 2009-04-22
  • 打赏
  • 举报
回复
主键不可能重复。呵呵。重复了只能叫索引,不能叫主键。。。
--------MSDN------------
主键(PRIMARY KEY )

来自MSDN的描述:

表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARY KEY 约束来创建主键。

一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束。

如果为表指定了 PRIMARY KEY 约束,则 SQL Server 2005 数据库引擎 将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。因此,所选的主键必须遵守创建唯一索引的规则。

创建主键时,数据库引擎 会自动创建唯一的索引来强制实施 PRIMARY KEY 约束的唯一性要求。如果表中不存在聚集索引或未显式指定非聚集索引,则将创建唯一的聚集索引以强制实施 PRIMARY KEY 约束。
t240034137 2009-04-22
  • 打赏
  • 举报
回复
不好意思 小弟菜蔬血浅。刚才在网上搜了一下还真有这事。这个是控制主键重复,希望有答案。一起学习http://topic.csdn.net/t/20060221/14/4568324.html
t240034137 2009-04-22
  • 打赏
  • 举报
回复
从来没听过主建 有重复的?
mugua604 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maoxianqiang 的回复:]
有空你們用壓力測試,試一下,有可能也和我的一樣的.我三個月前測過,就有重复记录,當多人操作的時間是一個時間點就有可能發生的.
3405164 00000100 90312-001499 90310-000107 040200J0220TCE E 20000.00 .00 .00 .00 2009-03-12 15:14:49.147
3405165 00000100 90312-001499 90311-000015 060300J0103T5E E 20000.00 .00 .00 .00 2009-03-12 15:14:49.147


3405164 100 90312-001499 90310-000107 2009/3/12 03:14:49 PM…
[/Quote]

还有,你能确认这个重复记录是否重复?
(零和哦)0和O!
maoyesky 2009-04-22
  • 打赏
  • 举报
回复
有空你們用壓力測試,試一下,有可能也和我的一樣的.我三個月前測過,就有重复记录,當多人操作的時間是一個時間點就有可能發生的.
3405164 00000100 90312-001499 90310-000107 040200J0220TCE E 20000.00 .00 .00 .00 2009-03-12 15:14:49.147
3405165 00000100 90312-001499 90311-000015 060300J0103T5E E 20000.00 .00 .00 .00 2009-03-12 15:14:49.147


3405164 100 90312-001499 90310-000107 2009/3/12 03:14:49 PM
3405165 100 90312-001499 90311-000015 2009/3/12 03:14:49 PM
maoyesky 2009-04-22
  • 打赏
  • 举报
回复
是不是以前没有建主键的时候里边就已经有数据了?
后来建主键的时候提示有重复记录而选择了不检测已有数据,导致了未建主键前就有重复数据一直存在到现在。
现在再加入重复记录应该是会报错的。


不是的,我的表結構是不會變的.是有主键的,主键的也沒有取消過,我是3個月前發現此問題,數據已把重复记录進行處理過(修改成不重复),現在新的記錄中又有了20多條.總新增加的記錄100多萬行!!!
maoyesky 2009-04-22
  • 打赏
  • 举报
回复
熟不了的木瓜
謝謝!我的程序在使用過程中確實有點慢,表記錄才400多萬行,20多個客戶端同進處理時比較慢了.下次按你的意見處理這個函數,把最大編號存放在一個固定小表中.有關重複記錄的事情是為何呢.....
mugua604 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jia_guijun 的回复:]
是不是以前没有建主键的时候里边就已经有数据了?
后来建主键的时候提示有重复记录而选择了不检测已有数据,导致了未建主键前就有重复数据一直存在到现在。
现在再加入重复记录应该是会报错的。
[/Quote]
这个基本上是不可能的,有约束.是不允许创建的!
jia_guijun 2009-04-22
  • 打赏
  • 举报
回复
是不是以前没有建主键的时候里边就已经有数据了?
后来建主键的时候提示有重复记录而选择了不检测已有数据,导致了未建主键前就有重复数据一直存在到现在。
现在再加入重复记录应该是会报错的。
mugua604 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 maoxianqiang 的回复:]
當我故意插入一條主鍵重復的記錄時 不讓寫入,不知道重復是怎麼來的啊,高手們啊有沒有遇到過啊
[/Quote]

没有..基本上是不可能,系统有约束的!
mugua604 2009-04-22
  • 打赏
  • 举报
回复


CREATE Function get_outstock_id(@date datetime)
returns varchar(12)
as
begin
Declare @id varchar(12)
Declare @maxnum varchar(6)
Select @id = right(convert(varchar(8),@date,112),5)
Select @maxnum = isnull(max(right(ckid,6)),'0') from sto_outstock
where ckid like @id + '%'
Select @maxnum = right('000000' + convert(varchar(6),
convert(int,@maxnum) + 1) ,6)
return @id + '-' + @maxnum
End

---对于你这个函数我有个建议,
---@maxnum每次都存储起来比你现在的方式快很多!
---还有,就是你还不能处理补号的问题!
maoyesky 2009-04-22
  • 打赏
  • 举报
回复
當我故意插入一條主鍵重復的記錄時 不讓寫入,不知道重復是怎麼來的啊,高手們啊有沒有遇到過啊
mugua604 2009-04-22
  • 打赏
  • 举报
回复
主键必须唯一...
rucypli 2009-04-22
  • 打赏
  • 举报
回复
主键竟然有重复的?
mugua604 2009-04-22
  • 打赏
  • 举报
回复
主键有重复,没遇到过!
maoyesky 2009-04-22
  • 打赏
  • 举报
回复
再簡單說明一下

是不有標籤列的表,別的主鍵字段值就可重復了.

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧