Java开发网 |
注册 |
登录 |
帮助 |
搜索 |
排行榜 |
发帖统计
|
您没有登录 |
» Java开发网 » Database/JDBC/SQL/JDO/Hibernate
打印话题 寄给朋友 订阅主题 |
作者 | 如何在MySQL中使用外键,使用事务处理。 |
scottding
十三部落酋长 CJSDN高级会员 发贴: 1054 积分: 101 |
于 2002-12-10 15:39
从 MySQL 3.23.43b 开始, InnoDB 就支持外键约束,作为数据引用完整性的重要特色,InnoDB 在外键支持上开创了 MySQL 各种表类型的先河。InnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 相似的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。MySQL 的源代码中,从 3.23.34a 开始包含 InnoDB 表,并在 MySQL -Max 的二进制版本中激活。如果你使用源码版本下载,自己编译的话,需要采用 --with-innodb 选项: ./configure --with-innodb 在 MySQL-Max-3.23 上使用 InnoDB 时,必须在 my.cnf 或者 my.ini (Windows)文件中的 [mysqld] 小节指定启动参数: [mysqld] # You can write your other MySQL server options here # ... # Data file(s) must be able to # hold your data and indexes. # Make sure you have enough # free disk space. innodb_data_file_path = ibdata1:10M:autoextend # Set buffer pool size to # 50 - 80 % of your computer's # memory set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # Set the log file size to about # 25 % of the buffer pool size set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # Set ..flush_log_at_trx_commit # to 0 if you can afford losing # some last transactions innodb_flush_log_at_trx_commit=1 注意 InnoDB 不会自己建立目录,你必须使用操作系统命令建立目录,并注意 MySQL 的权限。 第一次运行 MySQL 时,建议使用命令行方式。在 Windows 下,用命令行开启: C:\MYSQL\bin>mysqld-max --standalone --console 你可以看到下面的信息 InnoDB: The first specified data file .\ibdata did not exist: InnoDB: a new database to be created! 021210 14:46:34 InnoDB: Setting file .\ibdata size to 10 MB InnoDB: Database physically writes the file full: wait... 021210 14:46:35 InnoDB: Log file .\ib_logfile0 did not exist: new to be created InnoDB: Setting log file .\ib_logfile0 size to 20 MB InnoDB: Database physically writes the file full: wait... 021210 14:46:36 InnoDB: Log file .\ib_logfile1 did not exist: new to be created InnoDB: Setting log file .\ib_logfile1 size to 20 MB InnoDB: Database physically writes the file full: wait... InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: Creating foreign key constraint system tables InnoDB: Foreign key constraint system tables created 021210 14:46:39 InnoDB: Started mysqld-max: ready for connections 现在,启动成功,然后你就可以使用外键约束和事务处理了。 为了得到好的性能,必须指定 InnoDB 参数,例如: 对于一台 128MB 内存, 10GB 硬盘的 Windows NT 机器的配置如下: [mysqld] innodb_data_home_dir = c:\ibdata # 数据文件必须能容下数据和索引 innodb_data_file_path = ibdata1:2000M;ibdata2:2000M # 设置缓冲池大小为内存的 50 - 80 % set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M innodb_log_group_home_dir = c:\iblogs # log_arch_dir 必须和 log_group_home_dir 一样 innodb_log_arch_dir = c:\iblogs innodb_log_archive=0 set-variable = innodb_log_files_in_group=3 # 设置日志文件大小为缓冲池的 15%。 set-variable = innodb_log_file_size=10M set-variable = innodb_log_buffer_size=8M # 如果丢失最近的几个事务影响不大的话,设置 flush_log_at_trx_commit 为 0。 innodb_flush_log_at_trx_commit=1 set-variable = innodb_file_io_threads=4 set-variable = innodb_lock_wait_timeout=50 建立外键的方法: 例子: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id)) TYPE=INNODB; 在InnoDB中外键约束的语法: [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES table_name (index_col_name, ...) [ON DELETE CASCADE | ON DELETE SET NULL | RESTRICT] 两表都必须为 InnoDB 类型,外键和被引用的键,必须是索引中的一个列,InnoDB 不会自动为外键建立索引,必须明确指明。 处理事务的方法: mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki'); Query OK, 1 row affected (0.00 sec) mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (15, 'John'); Query OK, 1 row affected (0.00 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM CUSTOMER; +------+--------+ | A | B | +------+--------+ | 10 | Heikki | +------+--------+ 1 row in set (0.00 sec) mysql> 如果你想让你的表以INNODB的类型建立,则,你可以在my.ini中修改,添加下面一行: default-table-type=innodb 详细信息可以参照: http://www.innodb.com/ibman.html |
话题树型展开 |
人气 | 标题 | 作者 | 字数 | 发贴时间 |
6831 | 如何在MySQL中使用外键,使用事务处理。 | scottding | 4950 | 2002-12-10 15:39 |
已读帖子 新的帖子 被删除的帖子 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |