首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求分析:关于新闻编号产生的有关问题

2013-10-12 
求分析:关于新闻编号产生的问题?请教一下各位:我现在有一个新闻库newsDB.其中库中有新闻表news,新闻分类表

求分析:关于新闻编号产生的问题?
请教一下各位:
我现在有一个新闻库newsDB.
其中库中有新闻表news,新闻分类表class,新闻与分类关联表newsclass.
因为newsDB考虑到需要P2P同步的问题,所以每张表中有site和ID字段(主键),这个ID 是自增的。
所以我重新在news表中建了一个NEWSid新闻编号字段与newsclass关联。
请问一下:怎么设置这个NEWSid不会重复?
因为有双向同步。所以怎么防止不重复。
请各位帮我分析分析。
或者我该如果设置这个新闻编号,在数据库双向同步的情况下。
数据库
[解决办法]


if OBJECT_ID('GETAUTONO','P') is not null drop proc GETAUTONO
go
CREATE PROCEDURE [dbo].[GETAUTONO] 
@AID VARCHAR(20),
@AUTONO VARCHAR(30) OUTPUT
AS
BEGIN
DECLARE @ADATE VARCHAR(20),@ALENGTH INT,@ANEXTNO INT,@ALASTDATE VARCHAR(8)
SELECT @AUTONO=ISNULL(APREFIX,''),@ADATE=ADATE,@ALENGTH=ALENGTH,@ANEXTNO=ANEXTNO,@ALASTDATE=ALASTDATE
FROM SMAUTO_1 WHERE AID=@AID
--GET DATEPART
DECLARE @DATEPART VARCHAR(10)
SET @DATEPART=CONVERT(VARCHAR(10),GETDATE(),120)
SET @DATEPART=CASE @ADATE
WHEN 'YYMM' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)
WHEN 'YYYYMM' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)
WHEN 'YY' THEN SUBSTRING(@DATEPART,3,2)
WHEN 'YYYY' THEN SUBSTRING(@DATEPART,1,4)
WHEN 'YYMMDD' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)
WHEN 'YYYYMMDD' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)
 ELSE ''
END
SET @AUTONO=@AUTONO+@DATEPART
--get next no
DECLARE @NEXTNO VARCHAR(30)
IF (@DATEPART='' OR @DATEPART=@ALASTDATE)
BEGIN
SET @NEXTNO=CONVERT(VARCHAR(30),@ANEXTNO)
SET @NEXTNO=REPLICATE('0',@ALENGTH-LEN(@NEXTNO))+@NEXTNO
UPDATE SMAUTO_1 SET ANEXTNO=ANEXTNO+1 WHERE AID=@AID
END
ELSE
BEGIN
SET @NEXTNO=REPLICATE('0',@ALENGTH-1)+'1'
UPDATE SMAUTO_1 SET ANEXTNO=2,ALASTDATE=@DATEPART WHERE AID=@AID 
END
SET @AUTONO=@AUTONO+@NEXTNO
END
go
--调用存储过程得到自动编号值
declare @v_output varchar(64)
exec [GETAUTONO] 'BONUSSEQ' , @v_output output 
select @v_output
/*
--以下是创建表语句
CREATE TABLE [dbo].[SMAUTO_1](
[AID] [varchar](50) not NULL unique,--自动编号唯一编码
[ADESC] [varchar](50) NULL,--编号描述EN
[ADESCCHS] [varchar](50) NULL,--编号描述CH
[APREFIX] [varchar](50) NULL,--前缀
[ADATE] [varchar](50) NULL,--时间格式
[ALENGTH] [int] NULL,--流水号长度
[ANEXTNO] [int] NULL,--下一编号
[ALASTDATE] [varchar](50) NULL,--***
[VGUID] [uniqueidentifier] NOT NULL,--主键
[VCRTTIME] [datetime] NULL,--创建日期
[VCRTUSER] [varchar](50) NULL,--创建人
[VMDTIME] [datetime] NULL,--修改时间
[VMDUSER] [varchar](50) NULL,--修改人
[VSTATUS] [varchar](50) NULL,--状态
[VLOCK] [varchar](50) NULL,--是否锁定
[VLOCKTIME] [datetime] NULL,--锁定时间
PRIMARY KEY CLUSTERED 
(
[VGUID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--ALENGTH 增加默认值约束
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_ALENGTH]  DEFAULT ('5') FOR [ALENGTH]
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_ANEXTNO]  DEFAULT ('1') FOR [ANEXTNO]
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_VGUID]  DEFAULT (newid()) FOR [VGUID]
GO */


[解决办法]
if OBJECT_ID('GETAUTONO','P') is not null drop proc GETAUTONO
go
CREATE PROCEDURE [dbo].[GETAUTONO] 
@AID VARCHAR(20),
@AUTONO VARCHAR(30) OUTPUT
AS
BEGIN
DECLARE @ADATE VARCHAR(20),@ALENGTH INT,@ANEXTNO INT,@ALASTDATE VARCHAR(8)
SELECT @AUTONO=ISNULL(APREFIX,''),@ADATE=ADATE,@ALENGTH=ALENGTH,@ANEXTNO=ANEXTNO,@ALASTDATE=ALASTDATE
FROM SMAUTO_1 WHERE AID=@AID
--GET DATEPART
DECLARE @DATEPART VARCHAR(10)
SET @DATEPART=CONVERT(VARCHAR(10),GETDATE(),120)
SET @DATEPART=CASE @ADATE
WHEN 'YYMM' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)
WHEN 'YYYYMM' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)
WHEN 'YY' THEN SUBSTRING(@DATEPART,3,2)
WHEN 'YYYY' THEN SUBSTRING(@DATEPART,1,4)
WHEN 'YYMMDD' THEN SUBSTRING(@DATEPART,3,2)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)


WHEN 'YYYYMMDD' THEN SUBSTRING(@DATEPART,1,4)+SUBSTRING(@DATEPART,6,2)+RIGHT(@DATEPART,2)
 ELSE ''
END
SET @AUTONO=@AUTONO+@DATEPART
--get next no
DECLARE @NEXTNO VARCHAR(30)
IF (@DATEPART='' OR @DATEPART=@ALASTDATE)
BEGIN
SET @NEXTNO=CONVERT(VARCHAR(30),@ANEXTNO)
SET @NEXTNO=REPLICATE('0',@ALENGTH-LEN(@NEXTNO))+@NEXTNO
UPDATE SMAUTO_1 SET ANEXTNO=ANEXTNO+1 WHERE AID=@AID
END
ELSE
BEGIN
SET @NEXTNO=REPLICATE('0',@ALENGTH-1)+'1'
UPDATE SMAUTO_1 SET ANEXTNO=2,ALASTDATE=@DATEPART WHERE AID=@AID 
END
SET @AUTONO=@AUTONO+@NEXTNO
END
go


--以下是创建表语句
CREATE TABLE [dbo].[SMAUTO_1](
[AID] [varchar](50) not NULL unique,--自动编号唯一编码
[ADESC] [varchar](50) NULL,--编号描述EN
[ADESCCHS] [varchar](50) NULL,--编号描述CH
[APREFIX] [varchar](50) NULL,--前缀
[ADATE] [varchar](50) NULL,--时间格式
[ALENGTH] [int] NULL,--流水号长度
[ANEXTNO] [int] NULL,--下一编号
[ALASTDATE] [varchar](50) NULL,--***
[VGUID] [uniqueidentifier] NOT NULL,--主键
[VCRTTIME] [datetime] NULL,--创建日期
[VCRTUSER] [varchar](50) NULL,--创建人
[VMDTIME] [datetime] NULL,--修改时间
[VMDUSER] [varchar](50) NULL,--修改人
[VSTATUS] [varchar](50) NULL,--状态
[VLOCK] [varchar](50) NULL,--是否锁定
[VLOCKTIME] [datetime] NULL,--锁定时间
PRIMARY KEY CLUSTERED 
(
[VGUID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--ALENGTH 增加默认值约束
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_ALENGTH]  DEFAULT ('5') FOR [ALENGTH]
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_ANEXTNO]  DEFAULT ('1') FOR [ANEXTNO]
GO
ALTER TABLE [dbo].[SMAUTO_1] ADD  CONSTRAINT [DF_SMAUTO_1_VGUID]  DEFAULT (newid()) FOR [VGUID]
GO 


[解决办法]
用newid()函数产生试试,用varchar存.
[解决办法]
2008 的merge replication号称可以处理主键冲突问题,不过貌似还不是很完美

热点排行