为何用Sql清空库,文件字节还特别大?~new~ (50分)

  • 主题发起人 主题发起人 pyk1
  • 开始时间 开始时间
P

pyk1

Unregistered / Unconfirmed
GUEST, unregistred user!
我用query1.sql:=('delete from mytable');可以清空表吗?我没加数据之前
文件大小是2K,加了数据后是30K,我执行了如上语句后,为什么
表的字节还特别大,不能恢复为2K。我该如何才能彻底清空库呢?
谢谢!
delphi_x@163.com
 
Query1.Close;
Query1.SQL:='SELECT ID FROM T1 WHERE (ID='+IntToStr(3)')';
Query1.Open;
if Query1.IsEmpty then
begin
Query1.Close;
Query1.SQL:='INSERT INTO T1 (ID) VALUES ('+IntToStr(3)+')';
Query1.Execute;
end;
 
在关键值字段建唯一索引
 
INSERT INTO youDestTable( ...)
SELECT ... FROM youSourceTable
WHERE KeyField Not in (SELECT KeyField FROM youDestTable);
 
在加入记录之前先查询一下有没有该记录,楼上已经有答案了。
 
同意nulk的做法。
 
先给每一条记录都编一个特定的序号,比如第一条记录的序号为1,第二条记录的序号为2
具体作法,1。在数据表加入一个新列,名字叫“序号”为数值型。
2。加一个新的数据表“table2"(为编号表),加入一“序号”的数值型的新列。
3。把这个“序号”的值填为1。
然后在窗口中添加记录时输入程序
//设AA为数值型
var AA:integer;
begin
AA:=table2['序号']+1
if table1.locate('序号',AA) then //查询有无此记录
begin
table1.append;
table2['序号']:=AA; //把table2里的“序号”列的值加1
table1['序号']:=AA; //把table2的值代入table1的表
end;
else
showmessage('此记录已有');
 
象sql server之类,清除了表格的数据,数据库并不会立即减少的.
可以执行备份和恢复就可以看到数据库的文件大小减少了
 
收缩一下数据库
 
to zryzry:
如何收缩?
 
这个使用于paradox数据库

首先,在uses中加入 DbiTypes,DbiProcs,DbiErrs;

将最后删除的记录恢复:

DbiSetProp(hDBIObj(table1.handle), curSOFTDELETEON,1);
table1.first;
for i:=1 to Table1.RecordCount do
begin
table1.UpdateCursorPos;
DbiUndeleteRecord(table1.handle);
table1.next;
end;
table1.first;
DbiSetProp(hDBIObj(table1.handle), curSOFTDELETEON,0);

彻底删除记录:

Table1.Exclusive:=True;
DbiPackTable(table1.dbHandle, table1.handle, NIL, NIL, true);
 
这个适用于Access数据库。
procedure TForm1.Button2Click(Sender: TObject);
var
Dest_DB_Connection: OleVariant;
l_Source_Con_Str, l_Dest_Con_Str: string;
begin
try
Dest_DB_Connection := CreateOleObject('JRO.JetEngine');
except
Exit;
end;

l_Source_Con_Str := 'Data Source=C:/1.mdb;';

l_Dest_Con_Str := 'Data Source=C:/2.mdb;';

try
OleCheck(Dest_DB_Connection.CompactDatabase(l_Source_Con_Str, l_Dest_Con_Str));
except
end;
end;
 
对于SQL Server,在他们的管理器里面可以实现
存储过程名叫trunc_log 什么的。记不清了。
 
数据库一般不缩小,为了性能,它的空间还留着,再写入的时候用这些空间。
下面是各种库类型的解决方法。
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then

raise EDatabaseError.Create('Table must be opened exclusively to pack');

// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));

// If the table is a Paradox table, you must call DbiDoRestructure...
if Props.szTableType = szPARADOX then begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...

Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...

Check(DbiDoRestructure(hDb, 1, @TableDesc,
nil, nil, nil, False));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +

'type to pack');

Table.Open;

end;
 
to pyk1
企业管理器中有
 
摘自大洋网

用 bcp命令把数据库中的记录都导出来保存到另一台机器,然后用truncate table tablename
的方式把所有记录都清空。然后执行dump transaction dbname with no_log 发现文件
log已显著减少,再用bcp命令导入,导入log文件又增大,但再用dump transaction
dbname with no_log ,效果不仅是使日志占的空间减少,日志文件的size也显著减少

 
后退
顶部