扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
有的,和oracle一样,SQL中也有行迁移
创新互联是一家专注于成都网站设计、成都网站建设与策划设计,交口网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:交口等地区。交口做网站价格咨询:028-86922220
行迁移记包含forwarding_stub 和forwarded 两种类型。这两类记录是因为数据页不能容纳更新后的记录而产生的,不是因为记录长度超过8060B引起的,所以这两类记录依然是行内记录,与行溢出记录是不同的。
这两种记录总是成对出现的,当出现forwarding_stub时,在别的页面中一定有与之对应的一条forwarded记录。
forwarding记录也叫forwarding_stub记录,记录头标志为0x04,它是一条完整的数据记录。虽然结构看起来特殊,但还是符合一般记录的结构,记录中主要内容就是在行中用8字节保存了指向移出后的记录的位置指针。
forwarded 记录,有时直接叫做迁移记录。记录头部标志为0x32. 它也是一条完整记录,格式跟一般记录略有差异,大体结构还是相同的。这里是存储了溢出前的那条记录的真实数据。
这两种记录的具体存储结构比较简单和直观,其逻辑结构会在下面的实例列举中结合具体数据记录来分析说明。
测试这种的方法太长了,不在这里具体列出,你可以到51CTO里面找一下,搜索SQL行迁移有具体的测试方法
如果一块数据磁盘空间无法保存某个数据时(比如以前是1k,现在update到2k,而当前块的空闲空间不足1k),则会将新的数据保存到另外一个新的块里,然后在以前的块保存一个新位置的地址连接。
行链接产生在第一次插入数据的时候如果一个block不能存放一行记录的情况下。这种情况下,Oracle将使用链接一个或者多个在这个段中保留的block存储这一行记录,行链接比较容易发生在比较大的行上,例如行上有LONG、LONG RAW、LOB等数据类型的字段.
推荐用WM_CONCAT函数
SELECT A.STD, WM_CONCAT(A.F3) NEW_RESUL
FROM (SELECT STD, F3
FROM (SELECT STD, F1 F3
FROM TABLE_A
UNION ALL
SELECT STD, F2 F3 FROM TABLE_A) A) A
GROUP BY A.STD
UPDATE
TABLE_NAME
SET
名称
=
(SELECT
Y.名称
FROM
TABLE_NAME
Y
WHERE
PID
=
0001),
代号
=
(SELECT
Y.代号
FROM
TABLE_NAME
Y
WHERE
PID
=
0001),
步骤
=
(SELECT
Y.步骤
FROM
TABLE_NAME
Y
WHERE
PID
=
0001),
效果图路径
=
(SELECT
Y.效果图路径
FROM
TABLE_NAME
Y
WHERE
PID
=
0001)
WHERE
PID
=
0032;
COMMIT;
我特意创建了一个表,字段跟你描述的一样.经过测试才回答你的.
针对单行记录的更新操作,这个是最简单的.
其次因为需要处理的记录条数少.不会影响性能.再次,表的字段少,查询速度快.
只是我是以ORACLE数据库来作为实例的,换成其他数据库,换下语法就OK了.
create
table
test_table
(
PID
VARCHAR2(20),
名称
VARCHAR2(20),
代号
VARCHAR2(20),
步骤
VARCHAR2(20),
效果图路径
VARCHAR2(20)
);
INSERT
INTO
test_table(PID,名称,代号,步骤,效果图路径)
VALUES
(
'0001'
,'苹果4','IP4','下单中','D:\苹果图');
INSERT
INTO
test_table(PID,名称,代号,步骤,效果图路径)
VALUES
(
'0032'
,'
','
','
','
');
COMMIT;
你可以试试,看我的正确不正确.
如果是SQLSERVER数据库,这样是手动执行的方式,
需要换成自动执行,就把这个SQL嵌套进存储过程中就OK了.
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流