zoukankan      html  css  js  c++  java
  • 数据库之表关系

    表的详细操作

    1.修改表名
    create table db1.t1 (
    id int primary key auto_increment,
    name char,
    age int)
    
    use db1;
    alter table t1 rename zt;
    alter table zt rename t1;
    
    2.修改表字段属性
    alter table t1 modify name char(16) not full default "无名氏";
    
    3.修改表引擎
    alter  table t1 engine myisam charset gbk;
    
    4.修改表字段名
    alter table t1 change name usr char(16);
    
    5.复制表
    ①复制结构,约束条件,不复制数据
    insert t1 (usr,age) values ("zb",18),("egon",28),("alex",38);
    
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | usr   | varchar(16) | YES  |     | NULL    |                |
    | age   | int(11)     | YES  |     | NULL    |                |
    
    ----------------------------------------------------+
    | t1    | CREATE TABLE `t1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `usr` varchar(16) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
    
    create table t2 like t1;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | usr   | varchar(16) | YES  |     | NULL    |                |
    | age   | int(11)     | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    
    mysql> select * from t2;
    Empty set (0.00 sec)
    
    | t2    | CREATE TABLE `t2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `usr` varchar(16) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    
    ②复制结构和数据,不复制约束条件
    create table t3 select * from t1;
    -------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   |     | 0       |       |
    | usr   | varchar(16) | YES  |     | NULL    |       |
    | age   | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    
    ③不复制数据,约束条件,仅复制结构
    create table t4 select * from t1 where i<0;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | NO   |     | 0       |       |
    | usr   | varchar(16) | YES  |     | NULL    |       |
    | age   | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    
    5.添加字段名
    ①在字段尾添加字段
    alter table t1 add sex enum("male","female")  not null default "male";
    ②在字段首添加字段
    alter table t1 add gender char(16) first;
    ③在某个字段后添加字段
    alter table t1 add salary float after  age int;#字段 必须加类型
    6.删除字段名
    alter table t1 drop gender;
    7.清空表
    truncate  t1
    会将表重置,自增字段重置
    

    特殊表(mysql.user)=>用户管理

    操作前提:登陆root用户
    1.重要字段
    Host,User,Password
    
    use mysql;
    
    select Host ,User,Password from user;
     Host      | User | Password                                  |
    +-----------+------+-------------------------------------------+
    | localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    | 127.0.0.1 | root |                                           |
    | ::1       | root |                                           |
    | localhost |      |                                           |
    最后一个为 游客
    2.新建用户
    ①create user 用户名@主机名 identified by "密码"
    create user zb@localhost identified by "zb";
    C:WINDOWSsystem32>mysql -uzb -pzb(登陆不能加分号)
    --------------+
    | user()       |
    +--------------+
    | zb@localhost |
    +--------------+
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | test               |
    啥权限也没有
    
    3.设置用户权限
    grant 权限 on 数据库名.表名 to 用户名@主机名[with grant option];
    mysql> grant select,create,alter on db1.* to zb@localhost identified by "123";
    ERROR 1044 (42000): Access denied for user 'zb'@'localhost' to database 'db1'
    
    权限有select delete update insert drop ... all代表所有权限
    mysql> grant all on db1.* to zb@localhost;
    mysql> drop database db1;
    Query OK, 4 rows affected (0.04 sec)
    设置权限时如果没有当前用户,会自动创建用户,提倡使用
    
    重点:grant all on db1.* to owen@localhost identified by "owen";
    grant all on *.* to robert@localhost identified by "robert";
    | User   | Host      | Password                                  |
    +--------+-----------+-------------------------------------------+
    | robert | localhost | *A14C02465C2ED43BDB89ACC6C7213C1D00617758 |
    
    
    4.撤销权限
    revoke 权限名 on 数据库名.表名 from 用户名@主机名;
    revoke all on *.* from robert@localhost;
    
    5.修改密码
    用户:
    未登陆前设置密码
    C:WINDOWSsystem32>mysqladmin -uzb -p123 password "1234"
    mysqladmin -uroot -p旧密码 password "新密码"
    登陆后修改密码
    set password  = password("新密码");
    管理员:
    set password for owen@localhost = password("123");
    
    6.删除用户
    drop user 用户名@主机名
    mysql> drop user robert@localhost;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select User,Host,Password from mysql.user;
    +------+-----------+-------------------------------------------+
    | User | Host      | Password                                  |
    +------+-----------+-------------------------------------------+
    | root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    | root | 127.0.0.1 |                                           |
    | root | ::1       |                                           |
    |      | localhost |                                           |
    | zb   | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    

    表关系
    多对一

    a 表中有多个数据 共同使用 b表的一个数据
    而b表的数据只对应一个a表的数据
    则 b 表为主表,a表为从表
    先建主表,再建从表,在从表中设置主表的唯一字段(通常为主键)作为外键
    use db1;
    create table school (
    id int primary key auto_increment,
    name char(16)
    );
    create table student(
    id int primary key auto_increment,
    name char(16),
    school_id  int,
    foreign key(school_id) references school(id)
    on update cascade#设置级联
    on delete cascade);
    先添加主表,后添加从表
    mysql> insert school (name) values("bj"),("sh");
     insert student (name,school_id)values("zb",1),("egon",2),("alex",1);
    #?如果设置忘记级联应该怎么办?
    
    #主表没办法被清空,删除
    #当存在id 1,2将id1改为3,后面就不能添加3
    #手动添加id 4 ,下次是5
    #手动添加id 7,下次是8
    
    加主键
    alter table student modify id int primary key auto_increment;
    加外键
    alter table student add constraint foreign key (school_id) references school(id) on update cascade on delete cascade;
    删除外键
    
    
    有外键时,主表不能被先删除
    先删除从表,再删除主表
    

    多对多
    将两表的关系放入关系表
    两表随便哪个先建
    create table student(
    id int primary key auto_increment,
    name char(16),
    core int);
    create table teacher(
    id int primary key auto_increment,
    name char(16) );

    create table stu_tec(
    id int primary key auto_increment,
    stu_id int,
    tec_id int,
    foreign key (stu_id) references student(id)
    on update cascade
    on delete cascade,
    foreign key(tec_id)references teacher(id)
    on update cascade
    on delete cascade);

    一对一
    ```python
    create table seat(
    id int primary key auto_increment,
    price int);
    
    create table passenger(
    id int primary key auto_increment,
    seat_id int unique,
    foreign key (seat_id)references seat(id));
  • 相关阅读:
    VMware Workstation 虚拟机纯 Linux 终端如何安装 VMware Tools ?
    Linux Debian 如何部署 Qt?
    D3D9和OpenGL加载纹理图片的API是哪个?
    为什么调用 GdiplusShutdown 函数会在 DllExports::GdipDeleteGraphics(nativeGraphics) 位置抛出异常?
    What are DESC and ASC Keywords?
    qt sql 模块有哪些类?
    如何使用cmd命令行打开一个文件夹?
    cvs 文件如何解析?
    qt 如何给图元安装一个场景事件过滤器?
    linux命令 cp 递归复制 带权限复制
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10246334.html
Copyright © 2011-2022 走看看