〔mysql〕表A中有字段classId(可重复),现新增了数字类型的字段seq,需要给现有的数据

〔mysql〕表A中有字段classId(可重复),现新增了数字类型的字段seq,需要给现有的数据,第1张

数据分类:

protected function insert()

{

$res = array()           //存放id与seq

$data = mysql_query("select * from A") //取出所有的数据

$count = count($data)     //数据总条数

for($i = 0$i<$count$i++){

    if(array_key_exist($i,$res))continue 

    $star = 0           //seq的值

    for($j = $i+1$j<$count$j++){

        if($data[$i]['classId'] == $data[$j]['classId']){

            $res[$j]=$star //将classId相同的数据的id当做键名放入数组

            $star++        

        }

    }

    return $res

}

返回的$res ,以id为键名,seq值为值:('1'=>'0', '5'=>'2',  '10'=>'3'...)大概这个样子。

循环插入数据库

foreach($res $k=>$v){

    mysql_query("insert into A (seq) values ('$v') where id=$k ")

}

获取新插入Oracle数据库Sequence值的5种方法如下:

//公共代码:得到数据库连接

public Connection getConnection() throws Exception{

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:dbname", "username", "password")

return conn

}

//方法一

//先用select seq_t1.nextval as id from dual 取到新的sequence值。

//然后将最新的值通过变量传递给插入的语句:insert into t1(id) values(?)

//最后返回开始取到的sequence值。

//这种方法的优点代码简单直观,使用的人也最多,缺点是需要两次sql交互,性能不佳。

public int insertDataReturnKeyByGetNextVal() throws Exception {

Connection conn = getConnection()

String vsql = "select seq_t1.nextval as id from dual"

PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql)

ResultSet rs=pstmt.executeQuery()

rs.next()

int id=rs.getInt(1)

rs.close()

pstmt.close()

vsql="insert into t1(id) values(?)"

pstmt =(PreparedStatement)conn.prepareStatement(vsql)

pstmt.setInt(1, id)

pstmt.executeUpdate()

System.out.print("id:"+id)

return id

}

//方法二

//先用insert into t1(id) values(seq_t1.nextval)插入数据。

//然后使用select seq_t1.currval as id from dual返回刚才插入的记录生成的sequence值。

//注:seq_t1.currval表示取出当前会话的最后生成的sequence值,由于是用会话隔离,只要保证两个SQL使用同一个Connection即可,对于采用连接池应用需要将两个SQL放在同一个事务内才可保证并发安全。

//另外如果会话没有生成过sequence值,使用seq_t1.currval语法会报错。

//这种方法的优点可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码,缺点是需要两次sql交互,性能不佳,并且容易产生并发安全问题。

public int insertDataReturnKeyByGetCurrVal() throws Exception {

Connection conn = getConnection()

String vsql = "insert into t1(id) values(seq_t1.nextval)"

PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql)

pstmt.executeUpdate()

pstmt.close()

vsql="select seq_t1.currval as id from dual"

pstmt =(PreparedStatement)conn.prepareStatement(vsql)

ResultSet rs=pstmt.executeQuery()

rs.next()

int id=rs.getInt(1)

rs.close()

pstmt.close()

System.out.print("id:"+id)

return id

}

//方法三

//采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。

//这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。

public int insertDataReturnKeyByPlsql() throws Exception {

Connection conn = getConnection()

String vsql = "begin insert into t1(id) values(seq_t1.nextval) returning id into :1end"

CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql)

cstmt.registerOutParameter(1, Types.BIGINT)

cstmt.execute()

int id=cstmt.getInt(1)

System.out.print("id:"+id)

cstmt.close()

return id

}

//方法四

//采用PreparedStatement的getGeneratedKeys方法

//conn.prepareStatement的第二个参数可以设置GeneratedKeys的字段名列表,变量类型是一个字符串数组

//注:对Oracle数据库这里不能像其它数据库那样用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,这种语法是用来取自增类型的数据。

//Oracle没有自增类型,全部采用的是sequence实现,如果传Statement.RETURN_GENERATED_KEYS则返回的是新插入记录的ROWID,并不是我们相要的sequence值。

//这种方法的优点是性能良好,只要一次sql交互,实际上内部也是将sql转换成oracle的returning into的语法,缺点是只有Oracle10g才支持,使用较少。

public int insertDataReturnKeyByGeneratedKeys() throws Exception {

Connection conn = getConnection()

String vsql = "insert into t1(id) values(seq_t1.nextval)"

PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new String[]{"ID"})

pstmt.executeUpdate()

ResultSet rs=pstmt.getGeneratedKeys()

rs.next()

int id=rs.getInt(1)

rs.close()

pstmt.close()

System.out.print("id:"+id)

return id

}

//方法五

//和方法三类似,采用oracle特有的returning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。

//最后用getReturnResultSet取到新插入的sequence值,

//这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。

public int insertDataReturnKeyByReturnInto() throws Exception {

Connection conn = getConnection()

String vsql = "insert into t1(id) values(seq_t1.nextval) returning id into :1"

OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql)

pstmt.registerReturnParameter(1, Types.BIGINT)

pstmt.executeUpdate()

ResultSet rs=pstmt.getReturnResultSet()

rs.next()

int id=rs.getInt(1)

rs.close()

pstmt.close()

System.out.print("id:"+id)

return id

}

由于SQL2000里面没有"自动编号",所以你的以"自动编号"设置的字段都会变成非空的字段,这就必须手工修改这些字段,并把他的"标示"选择"是",种子为"1",增量为"1",

2,另外,ACCESS2000转换成SQL2000后,原来属性为"是/否"的字段将被转换成非空的"bit",这时候你必须修改成自己想要的属性了

ACCESS转SQL

SERVER中的一些经验

1.ACCESS的数据库中的自动编号类型在转化时,sql

server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!

2.转化时,跟日期有关的字段,SQL

SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。我遇见这种情况,用smalldatetime型时,转化失败,而用datetime型时,转化成功。

3.对此两种数据库进行 *** 作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete

*

from

user

where

id=10",而对SQL

SERVER数据库进行删除是用:"delete

user

where

id=10".

4.日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对

SQL

SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。

5.在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL

SERVER数据库处理中,却不能用。

1、必须先安装Microsoft

Office

Access

2003,和SQL

Server2000。2、把旧的动网数据库备份,备份完成后,用Access

2003打开动网旧数据库,在打开时会出现一个警告,不要理会它(安全警告),按打开键,打开后按工具栏——数据库实用工具——转换数据库——转换为2002-2003格式,把数据库转换成2003格式。

2、转换完成后再用Access

2003打开,打开后按工具栏——数据库实用工具——升迁向导——新建数据库——填写SQL数据库登陆名称、密码和要新建的动网数据库(准备转成新的动网数据库),按下一步,按“

》”键,再按下一步,选取所有选项,再按下一步,选择“不对应用程序作任何改动”,再按完成。

3、打开SQL企业管理器——数据库吹礁詹判陆ǖ亩菘饬税桑慊髡飧鍪菘庖幌拢缓笤诠ぞ呃浮?/FONT>SQL脚本——常规——全部显示——编写全部对象脚本——确定(记住存放的位置)。

4、用记事本打开刚才生成的SQL脚本,在编辑栏——替换——查找内容为“smalldatetime”替换为“datetime”——替换全部;完成后再在编辑栏——替换——查找内容为“nvarchar”替换为“varcha”——替换全部,完成后保存退出。

5、打开SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后在工具栏——SQL查询分析器——文件——打开——“刚才生成的SQL脚本”——查询——执行,然后关闭窗口。

6、再回到SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后打开工具栏——数据库转换服务——导入数据——下一步——数据源“Microsoft

Access”文件名“为旧的动网数据库”——下一步——再下一步——从源数据复制表和视图——下一步——全选——下一步——立即运行——下一步——完成。

7、修改动网文件夹两个文件conn.asp和inc\const.asp。

SQL时间函数是getdata()

参考资料:网上整理,因为当初我也碰到这问题


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

原文地址: http://outofmemory.cn/sjk/9904427.html

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

发表评论

登录后才能评论

评论列表(0条)

保存