如何用mysql设计一个论坛数据库

如何用mysql设计一个论坛数据库,第1张

简单用户表 tb_user:

userid , username

用户详细信息表 tb_userinfo

userid , email , homepage , phone , address

把用户信息分开的目的就是保证经常查询的数据在一张表,其它信息放到另一张表

论坛主题表 tb_bbs

bbsid , userid , title , ip , repleycount , replyuserid , createtime ,

论坛内容标 tb_bbs_content (此表可按照bbsid进行分表存储)

bbsid , content;

论坛回复表 tb_bbs_reply (此表可按照bbsid进行分表存储)

replyid , bbsid , userid , content , replytime , ip

http://topiccsdnnet/u/20080805/08/aa1cc594-fe80-4bac-8e40-e1ece2d3a78dhtml 无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数

所以,当我们在处理下列要求时,会比较麻烦:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到结果

id values

------ -----------

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1 旧的解决方法-- 1 创建处理函数

CREATE FUNCTION dbof_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 调用函数SELECt id, values=dbof_str(id)

FROM tb

GROUP BY id-- 2 新的解决方法

-- 示例数据

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查询处理

SELECT

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = Aid

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N/--结果

id values

----------- ----------------

1 aa,bb

2 aaa,bbb,ccc

(2 行受影响)

--/CSDN 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:

在安装sql 2005的示例后,默认安装目录为

drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中SQL code问题描述:

无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,

所以,当我们在处理下列要求时,会比较麻烦:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到结果:

id values

------ -----------

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1 旧的解决方法-- 1 创建处理函数

CREATE FUNCTION dbof_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 调用函数SELECt id, values=dbof_str(id)

FROM tb

GROUP BY id-- 2 新的解决方法

-- 示例数据

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查询处理

SELECT

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = Aid

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N/--结果

id values

----------- ----------------

1 aa,bb

2 aaa,bbb,ccc

(2 行受影响)

--/--各种字符串分函数--331 使用游标法进行字符串合并处理的示例。

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并处理

--定义结果集表变量

DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理

DECLARE tb CURSOR LOCAL

FOR

SELECT col1,col2 FROM tb ORDER BY col1,col2

DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)

OPEN tb

FETCH tb INTO @col1,@col2

SELECT @col1_old=@col1,@s=''

WHILE @@FETCH_STATUS=0

BEGIN

IF @col1=@col1_old

SELECT @s=@s+','+CAST(@col2 as varchar)

ELSE

BEGIN

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1

END

FETCH tb INTO @col1,@col2

END

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

CLOSE tb

DEALLOCATE tb

--显示结果并删除测试数据

SELECT FROM @t

DROP TABLE tb

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

GO

/==============================================/

--332 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

GO--合并处理函数

CREATE FUNCTION dbof_str(@col1 varchar(10))

RETURNS varchar(100)

AS

BEGIN

DECLARE @re varchar(100)

SET @re=''

SELECT @re=@re+','+CAST(col2 as varchar)

FROM tb

WHERE col1=@col1

RETURN(STUFF(@re,1,1,''))

END

GO--调用函数

SELECT col1,col2=dbof_str(col1) FROM tb GROUP BY col1

--删除测试

DROP TABLE tb

DROP FUNCTION f_str

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

GO/==============================================/

--333 使用临时表实现字符串合并处理的示例

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并处理

SELECT col1,col2=CAST(col2 as varchar(100))

INTO #t FROM tb

ORDER BY col1,col2

DECLARE @col1 varchar(10),@col2 varchar(100)

UPDATE #t SET

@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,

@col1=col1,

col2=@col2

SELECT FROM #t

/--更新处理后的临时表

col1 col2

---------- -------------

a 1

a 1,2

b 1

b 1,2

b 1,2,3

--/

--得到最终结果

SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

--删除测试

DROP TABLE tb,#t

GO

/==============================================/--3341 每组 <=2 条记录的合并

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'c',3--合并处理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT()=1 THEN ''

ELSE ','+CAST(MAX(col2) as varchar)

END

FROM tb

GROUP BY col1

DROP TABLE tb

/--结果

col1 col2

---------- ----------

a 1,2

b 1,2

c 3

--/--3342 每组 <=3 条记录的合并

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

UNION ALL SELECT 'c',3--合并处理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT()=3 THEN ','

+CAST((SELECT col2 FROM tb WHERE col1=acol1 AND col2 NOT IN(MAX(acol2),MIN(acol2))) as varchar)

ELSE ''

END

+CASE

WHEN COUNT()>=2 THEN ','+CAST(MAX(col2) as varchar)

ELSE ''

END

FROM tb a

GROUP BY col1

DROP TABLE tb

/--结果

col1 col2

---------- ------------

a 1,2

b 1,2,3

c 3

--/

GO

if not object_id('A') is null

drop table A

Go

Create table A([id] int,[cname] nvarchar(2))

Insert A

select 1,N'张三' union all

select 2,N'李四' union all

select 3,N'王五' union all

select 4,N'蔡六'

Go

--> --> if not object_id('B') is null

drop table B

Go

Create table B([id] int,[cname] nvarchar(5))

Insert B

select 1,N'1,2,3' union all

select 2,N'3,4'

Go

create function F_str(@cname nvarchar(100))

returns nvarchar(100)

as

begin

select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0

return @cname

end

go

select [id],dboF_str([cname])[cname] from Bid cname

----------- ----------------------------------------------------------------------------------------------------

1 张三,李四,王五

2 王五,蔡六

Session用于保存每个用户的专用信息每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右,可以在配置里面自行定义时间长短)Session中的信息保存在Web服务器内容中,保存的数据量可大可小当Session超时或被关闭时将自动释放保存的数据信息由于用户停止使用应用程序后它仍然在内存中保持一段时间,

因此使用Session对象使保存用户数据的方法效率很低()

对于小量的数据,使用Session对象保存还是一个不错的选择

使用Session对象保存信息的代码如下:

//存放信息

Session["key"]="value"

//读取数据

string UserName=Session["key"]ToString();

判断Session["key"]是否存在或是否失效(session超过保持时间会失效)

if(Session["key"]==null)

{}

http://topiccsdnnet/u/20080805/08/aa1cc594-fe80-4bac-8e40-e1ece2d3a78dhtml 无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,

所以,当我们在处理下列要求时,会比较麻烦:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到结果:

id values

------ -----------

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1 旧的解决方法-- 1 创建处理函数

CREATE FUNCTION dbof_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 调用函数SELECt id, values=dbof_str(id)

FROM tb

GROUP BY id-- 2 新的解决方法

-- 示例数据

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查询处理

SELECT

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = Aid

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N/--结果

id values

----------- ----------------

1 aa,bb

2 aaa,bbb,ccc

(2 行受影响)

--/CSDN 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:

在安装sql 2005的示例后,默认安装目录为

drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中SQL code问题描述:

无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,

所以,当我们在处理下列要求时,会比较麻烦:

有表tb, 如下:

id value

----- ------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

需要得到结果:

id values

------ -----------

1 aa,bb

2 aaa,bbb,ccc

即, group by id, 求 value 的和(字符串相加)1 旧的解决方法-- 1 创建处理函数

CREATE FUNCTION dbof_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + value

FROM tb

WHERE id=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 调用函数SELECt id, values=dbof_str(id)

FROM tb

GROUP BY id-- 2 新的解决方法

-- 示例数据

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'-- 查询处理

SELECT

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = Aid

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N/--结果

id values

----------- ----------------

1 aa,bb

2 aaa,bbb,ccc

(2 行受影响)

--/--各种字符串分函数--331 使用游标法进行字符串合并处理的示例。

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并处理

--定义结果集表变量

DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理

DECLARE tb CURSOR LOCAL

FOR

SELECT col1,col2 FROM tb ORDER BY col1,col2

DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)

OPEN tb

FETCH tb INTO @col1,@col2

SELECT @col1_old=@col1,@s=''

WHILE @@FETCH_STATUS=0

BEGIN

IF @col1=@col1_old

SELECT @s=@s+','+CAST(@col2 as varchar)

ELSE

BEGIN

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1

END

FETCH tb INTO @col1,@col2

END

INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))

CLOSE tb

DEALLOCATE tb

--显示结果并删除测试数据

SELECT FROM @t

DROP TABLE tb

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

GO

/==============================================/

--332 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

GO--合并处理函数

CREATE FUNCTION dbof_str(@col1 varchar(10))

RETURNS varchar(100)

AS

BEGIN

DECLARE @re varchar(100)

SET @re=''

SELECT @re=@re+','+CAST(col2 as varchar)

FROM tb

WHERE col1=@col1

RETURN(STUFF(@re,1,1,''))

END

GO--调用函数

SELECT col1,col2=dbof_str(col1) FROM tb GROUP BY col1

--删除测试

DROP TABLE tb

DROP FUNCTION f_str

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

GO/==============================================/

--333 使用临时表实现字符串合并处理的示例

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3--合并处理

SELECT col1,col2=CAST(col2 as varchar(100))

INTO #t FROM tb

ORDER BY col1,col2

DECLARE @col1 varchar(10),@col2 varchar(100)

UPDATE #t SET

@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,

@col1=col1,

col2=@col2

SELECT FROM #t

/--更新处理后的临时表

col1 col2

---------- -------------

a 1

a 1,2

b 1

b 1,2

b 1,2,3

--/

--得到最终结果

SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1

/--结果

col1 col2

---------- -----------

a 1,2

b 1,2,3

--/

--删除测试

DROP TABLE tb,#t

GO

/==============================================/--3341 每组 <=2 条记录的合并

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'c',3--合并处理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT()=1 THEN ''

ELSE ','+CAST(MAX(col2) as varchar)

END

FROM tb

GROUP BY col1

DROP TABLE tb

/--结果

col1 col2

---------- ----------

a 1,2

b 1,2

c 3

--/--3342 每组 <=3 条记录的合并

--处理的数据

CREATE TABLE tb(col1 varchar(10),col2 int)

INSERT tb SELECT 'a',1

UNION ALL SELECT 'a',2

UNION ALL SELECT 'b',1

UNION ALL SELECT 'b',2

UNION ALL SELECT 'b',3

UNION ALL SELECT 'c',3--合并处理

SELECT col1,

col2=CAST(MIN(col2) as varchar)

+CASE

WHEN COUNT()=3 THEN ','

+CAST((SELECT col2 FROM tb WHERE col1=acol1 AND col2 NOT IN(MAX(acol2),MIN(acol2))) as varchar)

ELSE ''

END

+CASE

WHEN COUNT()>=2 THEN ','+CAST(MAX(col2) as varchar)

ELSE ''

END

FROM tb a

GROUP BY col1

DROP TABLE tb

/--结果

col1 col2

---------- ------------

a 1,2

b 1,2,3

c 3

--/

GO

if not object_id('A') is null

drop table A

Go

Create table A([id] int,[cname] nvarchar(2))

Insert A

select 1,N'张三' union all

select 2,N'李四' union all

select 3,N'王五' union all

select 4,N'蔡六'

Go

--> --> if not object_id('B') is null

drop table B

Go

Create table B([id] int,[cname] nvarchar(5))

Insert B

select 1,N'1,2,3' union all

select 2,N'3,4'

Go

create function F_str(@cname nvarchar(100))

returns nvarchar(100)

as

begin

select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0

return @cname

end

go

select [id],dboF_str([cname])[cname] from Bid cname

----------- ----------------------------------------------------------------------------------------------------

1 张三,李四,王五

2 王五,蔡六

1)查看表中的触发器类型:\x0d\sp_helptrigger:返回对当前数据库的指定表定义的DML触发器的类型。sp_helptrigger不能用于DDL触发器。\x0d\示例:EXECsp_helptrigger'表名'\x0d\\x0d\2)查看触发器的有关信息:\x0d\sp_help:报告有关数据库对象(syssysobjects兼容视图中列出的所有对象)、用户定义数据类型或某种数据类型的信息。\x0d\示例:EXECsp_help'触发器名'\x0d\\x0d\3)显示触发器的定义:\x0d\sp_helptext:显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。\x0d\示例:EXECsp_helptext'触发器名'\x0d\\x0d\4)查看当前库中所有的触发器:\x0d\查询脚本:SELECTFROMSysobjectsWHERExtype='TR'\x0d\\x0d\5)查看当前库中所有的触发器和与之相对应的表:\x0d\查询脚本:SELECTtb2nameAStableName,tb1nameAStriggerNameFROMSysobjectstb1JOINSysobjectstb2ONtb1parent_obj=tb2idWHEREtb1type='TR'

tb_user你之前可以建立的是InnoDB存储的恢复时没有恢复InnoDB的数据

会在原数据库名下有tb_userfrm 这样如果你要新建同名表,就不能建立了

解决方法:到数据库下删除tb_userfrm 或者恢复你原来的InnoDB的数据

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12162853.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存