MYSQL 8 基本操作之01 (库、表)

  1. 创建DB
[root@XAG816 ~]# mysql.login

root@127.0.0.1 : (none)【10:14:13】2 SQL->show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

root@127.0.0.1 : (none)【10:14:22】3 SQL->CREATE DATABASE TESTDB;
  1. 创建表
root@127.0.0.1 : (none)【10:34:15】1 SQL->use testdb

root@127.0.0.1 : testdb【10:34:23】3 SQL->show tables;
Empty set (0.01 sec)

root@127.0.0.1 : testdb【10:37:24】4 SQL->create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

root@127.0.0.1 : testdb【10:37:36】5 SQL->desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename    | varchar(10)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+

root@127.0.0.1 : testdb【10:37:53】6 SQL->show create table emp \G;
*************************** 1. row ***************************
       Table: emp
Create Table: CREATE TABLE `emp` (
  `ename` varchar(10) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` decimal(10,2) DEFAULT NULL,
  `deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

root@127.0.0.1 : testdb【10:38:18】7 SQL->alter table emp modify ename varchar(20);

root@127.0.0.1 : testdb【10:38:39】8 SQL->alter table emp add column age int(3);

root@127.0.0.1 : testdb【10:38:53】9 SQL->alter table emp drop column age;

root@127.0.0.1 : testdb【10:39:46】11 SQL->alter table emp change hiredate hiredate_new date;

root@127.0.0.1 : testdb【10:40:36】12 SQL->alter table emp add birth date after ename;

root@127.0.0.1 : testdb【10:41:23】14 SQL->alter table emp add column age int(3);

root@127.0.0.1 : testdb【10:41:44】15 SQL->alter table emp modify age int(3) first;

root@127.0.0.1 : testdb【10:41:49】16 SQL->alter table emp rename emp1;

root@127.0.0.1 : testdb【10:42:17】18 SQL->show create table emp1 \G;
*************************** 1. row ***************************
       Table: emp1
Create Table: CREATE TABLE `emp1` (
  `age` int(3) DEFAULT NULL,
  `ename` varchar(20) DEFAULT NULL,
  `birth` date DEFAULT NULL,
  `hiredate_new` date DEFAULT NULL,
  `sal` decimal(10,2) DEFAULT NULL,
  `deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

root@127.0.0.1 : testdb【10:42:25】19 SQL->desc emp1;
+--------------+---------------+------+-----+---------+-------+
| Field        | Type          | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| age          | int(3)        | YES  |     | NULL    |       |
| ename        | varchar(20)   | YES  |     | NULL    |       |
| birth        | date          | YES  |     | NULL    |       |
| hiredate_new | date          | YES  |     | NULL    |       |
| sal          | decimal(10,2) | YES  |     | NULL    |       |
| deptno       | int(2)        | YES  |     | NULL    |       |
+--------------+---------------+------+-----+---------+-------+
  1. DML 语句
root@127.0.0.1 : testdb【10:47:29】23 SQL->create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

root@127.0.0.1 : testdb【10:47:31】24 SQL->create table dept(deptno int(2),deptname varchar(10));

root@127.0.0.1 : testdb【10:49:48】28 SQL->insert into emp(ename,hiredate,sal,deptno) values('xag1','1978-03-01',1000,1),('xag2','1978-03-02',2000,2);

root@127.0.0.1 : testdb【10:49:50】29 SQL->insert into dept(deptno,deptname ) values(1,'aa'),(2,'bb'),(3,'cc');

root@127.0.0.1 : testdb【10:51:00】30 SQL->select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| xag1  | 1978-03-01 | 1000.00 |      1 |
| xag2  | 1978-03-02 | 2000.00 |      2 |
+-------+------------+---------+--------+

root@127.0.0.1 : testdb【10:51:45】31 SQL->select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | aa       |
|      2 | bb       |
|      3 | cc       |
+--------+----------+

root@127.0.0.1 : testdb【10:51:53】32 SQL->update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

root@127.0.0.1 : testdb【10:51:58】33 SQL->select * from emp;
+-------+------------+---------+--------+
| ename | hiredate   | sal     | deptno |
+-------+------------+---------+--------+
| xag1  | 1978-03-01 | 1000.00 |      1 |
| xag2  | 1978-03-02 | 4000.00 |      2 |
+-------+------------+---------+--------+

root@127.0.0.1 : testdb【10:52:04】34 SQL->select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      1 | xag1     |
|      2 | xag2     |
|      3 | cc       |
+--------+----------+

#查询从第二条记录开始的2条记录(0表示第1条,1表示第二条)
root@127.0.0.1 : testdb【10:52:15】35 SQL->select * from dept order by deptno desc limit 1,2;
+--------+----------+
| deptno | deptname |
+--------+----------+
|      2 | xag2     |
|      1 | xag1     |
+--------+----------+

#按部门统计同时统计合计数
root@127.0.0.1 : testdb【10:53:43】36 SQL->select deptno,count(1) from emp group by deptno with rollup;
+--------+----------+
| deptno | count(1) |
+--------+----------+
|      1 |        1 |
|      2 |        1 |
|   NULL |        2 |
+--------+----------+
  1. 创建自增量的字段的表
root@127.0.0.1 : testdb【10:54:24】37 SQL->
create table mp_user
 (
 mp_user_seq int auto_increment not null,
 mp_user_name varchar(20),
 primary key(mp_user_seq)
 ) ;

root@127.0.0.1 : testdb【11:01:22】40 SQL->alter table mp_user auto_increment=100;

#OR
root@127.0.0.1 : testdb【11:01:57】43 SQL->drop table mp_user;
root@127.0.0.1 : testdb【11:02:19】44 SQL->
create table mp_user
 (
 mp_user_seq int auto_increment not null,
 mp_user_name varchar(20),
 primary key(mp_user_seq)
 ) auto_increment=100;

# last_insert_id() 查询当前线程最后一次插入记录使用的值(如果一次插入多个值则返回首条插入记录使用的自动增长值);
root@127.0.0.1 : testdb【12:23:23】18 SQL->insert mp_user(mp_user_name) values('a1');

root@127.0.0.1 : testdb【12:23:28】19 SQL->select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|              100 |
+------------------+

root@127.0.0.1 : testdb【12:23:37】20 SQL->insert mp_user(mp_user_name) values('a2'),('a3'),('a4');

root@127.0.0.1 : testdb【12:24:11】21 SQL->select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|              101 |
+------------------+

#2
create table my_account
(
  acc_seq int auto_increment not null,
  acc_no varchar(20),
  acc_name varchar(50),
  acc_banance decimal(12,2),
  acc_createtime datetime,
  acc_update datetime,
  primary key(acc_seq)
) auto_increment=1001;

alter table my_account add unique(acc_no); 

#3
create table my_account_tran
(
  tran_seq int auto_increment not null,
  acc_no varchar(20),
  tran_no varchar(30),
  tran_money decimal(10,2),
  tran_time datetime,
  primary key(tran_seq)
) auto_increment=1001;

alter table my_account_tran add unique(tran_no); 

alter table my_account_tran add constraint ck_tran_money check(tran_money between -1000 and 1000);

insert into my_account_tran(acc_no,tran_no,tran_money,tran_time) values('c1001','20160619100001',100,now());

#4 (此版捕获所有异常)
CREATE TABLE tb_log (errorno int,errortext TEXT,error_timestamp DATETIME);

DROP PROCEDURE IF EXISTS  proc_my_acc_rollback2;

DELIMITER $$
CREATE PROCEDURE proc_my_acc_rollback2
(
  in v_acc_no VARCHAR(20),
  in v_acc_name varchar(50),
  in v_tran_no varchar(30),
  in v_tran_money DECIMAL(10,2),
  out v_return varchar(500)
)
  BEGIN  
    DECLARE v_now datetime;
    DECLARE i TINYINT DEFAULT 1;
    DECLARE v_errcount INT DEFAULT 0;  /**获取一次错误数据条数 */
    DECLARE v_errno INT DEFAULT 0;/**获取错误代码*/
    DECLARE v_msg TEXT;/**获取错误详细信息*/
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION /**定义一个异常处理块*/
    BEGIN     
     get stacked diagnostics v_errcount = number;       
     set i=1;              
     WHILE i <= v_errcount
     DO
        GET stacked DIAGNOSTICS CONDITION i v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT; 
        SET v_return = CONCAT(v_return,v_errno);
        SET v_return = CONCAT(v_return,':');
        SET v_return = CONCAT(v_return,v_msg);
        SET v_return = CONCAT(v_return,'; '); 
        SET i = i + 1;
     END WHILE;
    END;

    /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/  
    -- start transaction;  
    /** 关闭事务的自动提交 */  
    SET autocommit = 0; 
    SET v_return='[proc_my_acc_rollback2 err:] ';         
    insert into my_account_tran(acc_no,tran_no,tran_money,tran_time) 
    values(v_acc_no,v_tran_no,v_tran_money,v_now);
    /**IF v_errcount=0 THEN */
    /* 注释掉上面if 语句表示 报错后继续运行,最后捕获所以异常,否则 出现第一个异常后就退出,仅仅能捕获第一个异常 */
        insert into my_account(acc_no,acc_name,acc_banance,acc_createtime)
    values(v_acc_no,v_acc_name,v_tran_money,v_now);
    /*END IF; */
    /** 标记被改变,表示事务应该回滚 */  
    IF v_errcount>0 THEN
        ROLLBACK; -- 事务回滚    
        SET autocommit =1;  
        INSERT INTO tb_log VALUES (v_errno,v_return,NOW());
    ELSE      
        COMMIT; -- 事务提交  
        SET autocommit =1; 
        SET v_return='[OK]';
    END IF;  
       
END$$
DELIMITER ;

#5 没问题版(此版捕获第一个异常)
DROP PROCEDURE IF EXISTS  proc_my_acc_rollback3;

DELIMITER $$
CREATE PROCEDURE proc_my_acc_rollback3
(
  in v_acc_no VARCHAR(20),
  in v_acc_name varchar(50),
  in v_tran_no varchar(30),
  in v_tran_money DECIMAL(10,2),
  out v_return varchar(500)
)
  BEGIN  
    DECLARE v_now datetime;
    DECLARE i TINYINT DEFAULT 1;
    DECLARE v_errcount INT DEFAULT 0;  /**获取一次错误数据条数 */
    DECLARE v_errno INT DEFAULT 0;/**获取错误代码*/
    DECLARE v_msg TEXT;/**获取错误详细信息*/
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION /**定义一个异常处理块*/
    BEGIN     
     get stacked diagnostics v_errcount = number;       
     set i=1;              
     WHILE i <= v_errcount
     DO
        GET stacked DIAGNOSTICS CONDITION i v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT; 
        SET v_return = CONCAT(v_return,v_errno);
        SET v_return = CONCAT(v_return,':');
        SET v_return = CONCAT(v_return,v_msg);
        SET v_return = CONCAT(v_return,'; '); 
        SET i = i + 1;
     END WHILE;
    END;

    /** 显式的开启事务,它开启后,事务会暂时停止自动提交*/  
    -- start transaction;  
    /** 关闭事务的自动提交 */  
    SET autocommit = 0; 
    SET v_return='[proc_my_acc_rollback3 err:] ';         
    insert into my_account_tran(acc_no,tran_no,tran_money,tran_time) 
      values(v_acc_no,v_tran_no,v_tran_money,v_now);
    IF v_errcount=0 THEN
    /* 注释掉上面if 语句表示 报错后继续运行,最后捕获所以异常,否则 出现第一个异常后就退出,仅仅能捕获第一个异常 */ 
      insert into my_account(acc_no,acc_name,acc_banance,acc_createtime)
      values(v_acc_no,v_acc_name,v_tran_money,v_now);
    END IF;
    /** 标记被改变,表示事务应该回滚 */  
    IF v_errcount>0 THEN
        ROLLBACK; -- 事务回滚    
        SET autocommit =1;  
        INSERT INTO tb_log VALUES (v_errno,v_return,NOW());
    ELSE      
        COMMIT; -- 事务提交  
        SET autocommit =1; 
        SET v_return='[OK]';
    END IF;  
       
END$$
DELIMITER ;

#6测试案例
root@127.0.0.1 : testdb【11:21:58】128 SQL-> delete from my_account_tran;
root@127.0.0.1 : testdb【11:22:42】129 SQL-> delete from my_account;

-- 交易编号重复&账号重复 测试
root@127.0.0.1 : testdb【11:37:09】198 SQL-> call proc_my_acc_rollback2('c1002','xag2','20160702100002',100,@msg);

root@127.0.0.1 : testdb【11:37:11】199 SQL-> select @msg;
+------+
| @msg |
+------+
| [OK] |
+------+

root@127.0.0.1 : testdb【11:37:20】200 SQL->select * from tb_log;
Empty set (0.00 sec)

root@127.0.0.1 : testdb【11:39:32】202 SQL->call proc_my_acc_rollback2('c1002','xag2','20160702100002',100,@msg);

root@127.0.0.1 : testdb【11:39:36】203 SQL->select @msg;
+---------------------------------------------------------------------------------------------------------------------------------------+
| @msg                                                                                                                                  |
+---------------------------------------------------------------------------------------------------------------------------------------+
| [proc_my_acc_rollback2 err:] 1062:Duplicate entry '20160702100002' for key 'tran_no'; 1062:Duplicate entry 'c1002' for key 'acc_no';  |
+---------------------------------------------------------------------------------------------------------------------------------------+

root@127.0.0.1 : testdb【11:39:46】204 SQL->select * from tb_log;
+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| errorno | errortext                                                                                                                             | error_timestamp     |
+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+
|    1062 | [proc_my_acc_rollback2 err:] 1062:Duplicate entry '20160702100002' for key 'tran_no'; 1062:Duplicate entry 'c1002' for key 'acc_no';  | 2019-07-11 23:39:36 |
+---------+---------------------------------------------------------------------------------------------------------------------------------------+---------------------+

--账号重复 测试
call proc_my_acc_rollback2('c1002','xag2','20160702100003',100,@msg);

root@127.0.0.1 : testdb【11:41:14】209 SQL->select @msg;
+------------------------------------------------------------------------------+
| @msg                                                                         |
+------------------------------------------------------------------------------+
| [proc_my_acc_rollback2 err:] 1062:Duplicate entry 'c1002' for key 'acc_no';  |
+------------------------------------------------------------------------------+

--金额超限
call proc_my_acc_rollback2('c1003','xag3','20160702100003',2000,@msg);
root@127.0.0.1 : testdb【11:53:03】252 SQL->select @msg;
+-----------------------------------------------------------------------------------+
| @msg                                                                              |
+-----------------------------------------------------------------------------------+
| [proc_my_acc_rollback2 err:] 3819:Check constraint 'ck_tran_money' is violated.;  |
+-----------------------------------------------------------------------------------+

-- 成功插入 测试
call proc_my_acc_rollback2('c1003','xag3','20160702100003',100,@msg);
root@127.0.0.1 : testdb【11:42:34】213 SQL->select @msg;
+------+
| @msg |
+------+
| [OK] |
+------+


#7 测试案例
root@127.0.0.1 : testdb【11:43:26】216 SQL->delete from my_account_tran;

root@127.0.0.1 : testdb【11:43:28】217 SQL->delete from my_account;

root@127.0.0.1 : testdb【11:43:35】218 SQL->delete from tb_log;

-- 交易编号重复&账号重复 测试
call proc_my_acc_rollback3('c1002','xag2','20160702100002',100,@msg);
root@127.0.0.1 : testdb【11:44:55】220 SQL->select @msg;
+------+
| @msg |
+------+
| [OK] |
+------+
root@127.0.0.1 : testdb【11:45:22】223 SQL->call proc_my_acc_rollback3('c1002','xag2','20160702100002',100,@msg);

root@127.0.0.1 : testdb【11:45:25】224 SQL->select @msg;
+----------------------------------------------------------------------------------------+
| @msg                                                                                   |
+----------------------------------------------------------------------------------------+
| [proc_my_acc_rollback3 err:] 1062:Duplicate entry '20160702100002' for key 'tran_no';  |
+----------------------------------------------------------------------------------------+

root@127.0.0.1 : testdb【11:45:29】225 SQL->select * from tb_log;
+---------+----------------------------------------------------------------------------------------+---------------------+
| errorno | errortext                                                                              | error_timestamp     |
+---------+----------------------------------------------------------------------------------------+---------------------+
|    1062 | [proc_my_acc_rollback3 err:] 1062:Duplicate entry '20160702100002' for key 'tran_no';  | 2019-07-11 23:45:25 |


--账号重复 测试
call proc_my_acc_rollback3('c1002','xag2','20160702100003',100,@msg);
root@127.0.0.1 : testdb【11:47:12】229 SQL->select @msg;
+------------------------------------------------------------------------------+
| @msg                                                                         |
+------------------------------------------------------------------------------+
| [proc_my_acc_rollback3 err:] 1062:Duplicate entry 'c1002' for key 'acc_no';  |

--交易编号重复测试
call proc_my_acc_rollback3('c1003','xag3','20160702100002',100,@msg);
root@127.0.0.1 : testdb【11:49:17】231 SQL->select @msg;
+----------------------------------------------------------------------------------------+
| @msg                                                                                   |
+----------------------------------------------------------------------------------------+
| [proc_my_acc_rollback3 err:] 1062:Duplicate entry '20160702100002' for key 'tran_no';  |
+----------------------------------------------------------------------------------------+

--金额超限
call proc_my_acc_rollback3('c1003','xag3','20160702100003',2000,@msg);
root@127.0.0.1 : testdb【11:51:53】237 SQL->select @msg;
+-----------------------------------------------------------------------------------+
| @msg                                                                              |
+-----------------------------------------------------------------------------------+
| [proc_my_acc_rollback3 err:] 3819:Check constraint 'ck_tran_money' is violated.;  |
+-----------------------------------------------------------------------------------+

-- 成功插入 测试
call proc_my_acc_rollback3('c1003','xag3','20160702100003',100,@msg);
root@127.0.0.1 : testdb【11:53:43】258 SQL->select @msg;
+------+
| @msg |
+------+
| [OK] |
+------+

root@127.0.0.1 : testdb【11:53:46】259 SQL->select * from my_account_tran;
+----------+--------+----------------+------------+-----------+
| tran_seq | acc_no | tran_no        | tran_money | tran_time |
+----------+--------+----------------+------------+-----------+
|     1011 | c1002  | 20160702100002 |     100.00 | NULL      |
|     1015 | c1003  | 20160702100003 |     100.00 | NULL      |
+----------+--------+----------------+------------+-----------+

root@127.0.0.1 : testdb【11:53:51】260 SQL->select * from my_account;
+---------+--------+----------+-------------+----------------+------------+
| acc_seq | acc_no | acc_name | acc_banance | acc_createtime | acc_update |
+---------+--------+----------+-------------+----------------+------------+
|    1010 | c1002  | xag2     |      100.00 | NULL           | NULL       |
|    1013 | c1003  | xag3     |      100.00 | NULL           | NULL       |
+---------+--------+----------+-------------+----------------+------------+
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容