您的位置:首页 > 数据库 > MySQL

mysql建立外键的一个demo

2013-11-21 11:31 471 查看
想要创建一个用户表,表中需要用户名、密码、签名、邮箱和图片,带有一个主键id

另外一个表是用户权利表,是描述用户的使用权利的,主键是用户个数计数器user_conut,还有救是txt新闻的查看次数(txtnewbrowsecount)、pic新闻的查看次数(picnewbrowsecount)、video新闻的查看次数(videonewbrowsecount),带有一个外键,是用户表表中的id

这两个表通过id来联系起来;

说一下主键:

就是区分一个表中的每一个数据项的,每一个数据项的主键都不一样,也就是用户表中不能出现相同id值得数据项

说一下外键:

不在本表中出现的,但是是本表中的约束; 打个比方,我在“用户表”中有一个id,值为2,那样我便可以在“用户权利表”中插入;但是在“用户表”并没有一个id值为99的,我要往“用户权利表”中插入数据,那么将会出现像下面的提示:

错误代码: 1452
Cannot add or update a child row: a foreign key constraint fails (`demo`.`user_limits`, CONSTRAINT `user_limits_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_info` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE)

当我要删除“用户表”中id值为2的数据项的时候,“用户权利表”中的数据将会一并删除,修改的是也是同样的;因为我使用的外键描述是:

FOREIGN KEY(user_id) REFERENCES  user_info(user_id) ON DELETE CASCADE ON UPDATE CASCADE


下面是demo中使用到的sql语句(包含测试数据、建数据库和查询语句):

DROP DATABASE IF EXISTS `demo`;

CREATE DATABASE demo
USE demo

DROP TABLE IF EXISTS `user`;

/*
新建一个user_info表
*/
CREATE TABLE user_info
(
    `user_id`  INTEGER(11) NOT NULL AUTO_INCREMENT,
    `username` NVARCHAR(64) COLLATE utf8_general_ci DEFAULT NULL,
    `password` NVARCHAR(64) COLLATE utf8_general_ci DEFAULT NULL,
    `qianming` TEXT COLLATE utf8_general_ci,
    `email`    NVARCHAR(64) COLLATE utf8_general_ci DEFAULT NULL, 
    `pic` VARCHAR(64) COLLATE utf8_general_ci DEFAULT NULL,
    PRIMARY KEY (`user_id`)
);
ENGINE=MYISAM AUTO_INCREMENT=237
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

/*
新建一个user_limits表
*/
DROP TABLE IF EXISTS `user_limits`;
CREATE TABLE user_limits(
    user_conut INTEGER(11) AUTO_INCREMENT PRIMARY KEY,
    txtnewbrowsecount INT,
    picnewbrowsecount INT,
    videonewbrowsecount INT,
    user_id INT,#外键user_info
    FOREIGN KEY(user_id) REFERENCES  user_info(user_id) ON DELETE CASCADE ON UPDATE CASCADE ##创建外键关系语句
)TYPE=INNODB AUTO_INCREMENT=237;

/*
往user_info表中插入测试数据
*/
INSERT INTO `user_info`
(`username`, `password`, `qianming`, `email`, `pic`)
VALUES
('zengraoli1', '123456', 'my name is zengraoli1', 'test@111.com', ''),
('zengraoli2', '123456', 'my name is zengraoli2', 'test@112.com', ''),
('zengraoli3', '123456', 'my name is zengraoli3', 'test@113.com', ''),
('zengraoli4', '123456', 'my name is zengraoli4', 'test@114.com', ''),
('zengraoli5', '123456', 'my name is zengraoli5', 'test@115.com', ''),
('zengraoli6', '123456', 'my name is zengraoli6', 'test@116.com', '');COMMIT;

/*
往user_limits表中插入测试数据
*/
INSERT INTO `user_limits`
VALUES
(NULL, 10, 10, 10, 1),
(NULL, 10, 8, 10, 2),
(NULL, 10, 10, 10, 3),
(NULL, 10, 10, 10, 4),
(NULL, 10, 0, 10, 5),
(NULL, 10, 2, 10, 69);COMMIT;

SELECT * FROM `user_info` WHERE user_info.user_id = 2;
SELECT * FROM `user_limits`;
SELECT * FROM `user_limits` WHERE user_limits.user_id = 2;
SELECT * FROM `user_info`,`user_limits` WHERE user_info.user_id = user_limits.user_id AND user_info.user_id = 2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: