扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
你建表的时候为什么不把那列弄成唯一约束?
创新互联是一家专注于成都网站制作、成都做网站和成都二枢机房的网络公司,有着丰富的建站经验和案例。
create procedure insert_pig
@str varchar(6), --定义一个输入参数,就是那个是不是重复的值
@str1 char(2)
--把每一列弄成变量存入,不知你的表有几字段,这里我就以两个字段为例
as
declare @sum int
begin tran
insert into admin (列1,列2) values (@str,@str1)
select @sum=count(*) from admin where username=@str
if(@sum0)
begin
raiserror('该品种已经存在',16,8)
rollback tran --滚回事务
end
else
commit tran --提交事务
GO
--调用存储过程
exec insert_pig '张三','男'
----张三,男就是传入的参数,也就是张三赋值给了@str,男赋值给了@str1
觉得可以给加加分吧
把重复的那个字段设置为主键,不用做任何判断,自动就是插入不了重复的数据了
2.就是你用sql判断是否存在这条信息决定是否插入if(exists(select * from tb where username='zhangshan'))
以上两种情况,看能不能满足你的需求
1、必须保证表中有主键或者唯一索引,或者某列数据不能重复。只有这样,才可能使用一句SQL来实现。否则只能考虑其它办法。下面的语句,假定BB列是不重复的,删除后保存BB列值最大的那条记录。
delete
from
表
where
aa
in
(select
aa
from
表
group
by
aa
having
count(aa)
1)
and
bb
not
in
(select
max(bb)
from
表
group
by
aa
having
count(aa)
1);
2、有多种写法:
delete
A
from
B
where
A.AA
=
B.AA
delete
A
from
A,B
where
A.AA
=
B.AA
delete
A
where
AA
in
(select
AA
from
B)
3、使用into关键字:
select
*
into
新表名
from
原表
4、取数据前3位,字段必须是类似char类型,使用类似substring这样的函数(SYBASE是substring,ORACLE是substr):
select
substring(字段,1,3)
from
表名
还是先上代码吧
,可以先看
SQL语句去掉重复记录,获取重复记录
复制代码
代码如下:
ALTER
procedure
[dbo].[PROC_ITEMMASTER_GETUNIQUE]
@PAGEINDEX
INT,@uid
int,@itemnumber
varchar(50)
AS
begin
tran
--开始事务
drop
table
[ItemMaster].[dbo].[testim]
--删除表
--把不重复记录转存到testim中
select
*
into
[ItemMaster].[dbo].[testim]
from
[ItemMaster].[dbo].[dat_item_master]
where
item_uid
in(select
min(item_uid)
as
item_uid
from
[ItemMaster].[dbo].[dat_item_master]
group
by
item_number)
and
status=0
select
top
10
*
from
[ItemMaster].[dbo].[testim]
where
item_uid
not
in
(select
top
(10*(@PAGEINDEX-1))
item_uid
from
[ItemMaster].[dbo].[testim])
and
owneruid=@uid
and
item_number
like
@itemnumber+'%'
--判断是否出错
if
@@error0
begin
rollback
tran
--出错则回滚
end
else
begin
--否则提前事务
commit
tran
end
我的数据是这样的:因为item_uid是标识列,item_number有重复的,
我想过滤成这样:
顺带说几个在编程的时候遇到的小问题
1.程序
出现
Could
not
find
stored
procedure
找不到这个存储过程
因为我的程序数据库有四个,而默认连接是A,但实际要执行B库里的存储过程,导致出错,
解决办法1:可在A里面建个一样的存储过程2:在执行连接的时候,替换下数据库就行了
2.
asp.net/C#
将存储过程中返回的数据集,填充到dataset/datatable
复制代码
代码如下:
SqlConnection
conn
=
new
SqlConnection(ConfigurationManager.ConnectionStrings["SolutionSQLServer"].ToString());
SqlCommand
cmd
=
new
SqlCommand("Test",conn);
cmd.CommandType
=
CommandType.StoredProcedure;
cmd.Parameters.Add("@MaxId",
SqlDbType.Int).Value
=
12000;
SqlDataAdapter
sda
=
new
SqlDataAdapter(cmd);
DataTable
dt
=
new
DataTable();
sda.Fill(dt);
在这感谢
3.在存储过程里面,写SQL语句不能动态不加order
by
功能
比如
复制代码
代码如下:
--·@new_orderby
是传入参数,不能这样写
select
top
(10*(2-1))
item_uid
from
testim
order
by
@new_orderby
--执行这个的时候,SQL会出现
The
SELECT
item
identified
by
the
ORDER
BY
number
1
contains
a
variable
as
part
of
the
expression
identifying
a
column
position.
Variables
are
only
allowed
when
ordering
by
an
expression
referencing
a
column
name.
不过我找到解决办法,不过很麻烦,
(第二个回答用
'
sql
'进行连接)
(用case
end
也行)
4.
select
into
和
insert
into
select
两种复制文句
(这里感谢)
1.INSERT
INTO
SELECT语句
语句形式为:Insert
into
Table2(field1,field2,...)
select
value1,value2,...
from
Table1
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。
2.SELECT
INTO
FROM语句
语句形式为:SELECT
vale1,
value2
into
Table2
from
Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
5.顺便复习下常用的SQL方法语句
复制代码
代码如下:
declare
@name
varchar(200)
--声明变量
set
@name='abcd;def'
--赋值
'exec
len
:'+Convert(varchar(10),Len(@name))
--convert(type,value)转换,Len(value)获取大小
'exec
charindex:'+Convert(varchar(10),CharIndex('e',@name))--CharIndex(find,value)
在value中查找find的位置
'not
replace:'+@name
'exec
replace:'+Replace(@name,';','')
--用replace替换
'exec
substring:'+Substring(@name,0,3)--用substring截取
@@RowCount
--返回上一行代码受影响的行数
作者:chenhuzi
select a.* from queueabandon a inner join (select min(callid) callid from queueabandon group by callid) b on a.callid=b.callid
1、要有定位基准,也就是说,你的表必需要有一个不重复的键值,如果没有,请你给这个表加一个字段,将这个字段设为自增变量字段,建议为int类型,比如字段名可为“编码”。
2、查重复的数据:
select *from 表名 where 编码 in
(select 编码 from 表名 group by 编码 having count(1) = 2)
3、删除所有有重复的记录:
delete from 表名 where
编码 in(select 编码 from 表名 group by 编码 having count(1) = 2)
4、删去重复的,只留下重复记录中编码最大的一条:
delete from 表名 where
编码 in(select 编码 from 表名 group by 编码 having count(1) = 2)
and 编码 not in (select max(编码)from 表名 group by 编码 having count(1) =2)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流