注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

MFC到wxWidgets移植笔记(8)——数据库设计  

2008-05-12 13:27:11|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

据我实验感觉,sqlite3的内部数据,实际上都是二进制。其实所有的数据库,内部都是以二进制保存。只不过通过那些数据库的访问接口,必须根据正确的类型来获得数据。sqlite3在这方面做得更开放一些,或者说更不严格。虽然在创建表的时候可以指定字段的类型和长度,实际存储或者读取的时候,是可以用其它类型的,并且不会出错。

但是即便如此,我们也还是要设计一个完善的数据库定义,这样对于以后数据的移植也方便得多。

以下是我用Sqlite Developer导出的表user的定义:

Drop Table If Exists [user];
CREATE TABLE IF NOT EXISTS  'user'(
[id] integer PRIMARY KEY
,[name] varchar(32) UNIQUE NOT NULL
,[pass] varchar(128) NOT NULL
,[last_time_login] datetime
);

可以看到,大部分的sql关键字都支持,语法非常通用。

再看表bank的定义:

Drop Table If Exists [bank];
CREATE TABLE IF NOT EXISTS  'bank'(
[id] integer PRIMARY KEY
,[user_id] integer NOT NULL
,[name] varchar(32) NOT NULL
,[last_time_record] datetime
);

字段user_id是一个外键,与user中的id具有删除关联。在前面提到过,sqlite3不支持外键,可以用触发器实现:

Drop Trigger If Exists [tgrDeleteUser];
CREATE TRIGGER IF NOT EXISTS  [tgrDeleteUser] AFTER DELETE On [user] FOR EACH ROW
begin
    delete from bank where user_id=old.id;
end;

Drop Trigger If Exists [tgrInsertBank];
CREATE TRIGGER IF NOT EXISTS  [tgrInsertBank] BEFORE INSERT On [bank] FOR EACH ROW
begin
    select raise(rollback, 'insert invalid')
    where (select id from user where id=new.user_id) is null;   
end;

  评论这张
 
阅读(9)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017