zoukankan      html  css  js  c++  java
  • MYSQL增删改查添加外键

     给商品表(从表)添加一个外键

    ALTER TABLE 表名 ADD CONSTRAINT 外键约束名 FOREIGN KEY(列名) REFERENCES 引用外键表(列名)



    ALTER TABLE product ADD CONSTRAINT FK_cno FOREIGN KEY(cno) REFERENCES category(cid );


    无法添加外键产生这个错误的多数原因有一下几点: 
    1,两张表里要设主键和外键的字段的数据类型或者数据长度不一样 (例如这个是int 另外一个是tinyint,或者都是int,但是设置的长度不同)


    2,某个表里记录数据没有记录,或者数据不一致。

    3、两个表的引擎不一样,查看表的引擎语句:

    show table status from 数据库名 where name='表名';

    4、要设置外键的字段不能为主键

    5、改建所参考的字段必须为主键        (就是说第一个表关联的不能设置为主键,第2个表关联的必须为主键)

    6、两个字段必须具有相同的数据类型和约束

    我遇到的情况就是4、5。后面关联的表的字段必须被设置为主键,才能关联成功。

    添加索jmeter是索引名称,aa是表名,id是列名称

    CREATE INDEX jmeter ON aa(id);

    查看索引语法,aa是表名

    SHOW KEYS FROM aa;





    sql语句的执行顺序是:from-->WHERE-->GROUP BY -->HAVING --- >ORDER BY --> SELECT;




    sql语句的编写顺序是:select  ->  FROM  -> WHERE  -> GROUP BY ->  HAVING  -> ORDER BY;

    转换代码:convert(字段名 using gbk)


    命令启动:services.msc   找到MySQL启动
    dos窗口启动cmd  MySQL -u root{默认账户} -p   显示输入密码没有密码直接回车
    创建数据库:create database 名字;
    查看数据库:show databases;


    创建表:CREATE TABLE s(id INT(50),NAME VARCHAR(50),sex CHAR(2),birthday DATETIME);
    date(精确到年月日)datetime(精确到年月日时分秒)

    删除表:drop table customer;





    ALTER TABLE aa RENAME bb; -- 修改表名,把表名aa修改成bb表


    ALTER TABLE customer ADD age INT(20); -- 增加表字段,customer 为表名,age为添加的字段,int(20),整数类型20长度,


    ALTER TABLE customer DROP sex; -- 删除表字段customer 为表名,sex为要删除的字段


    ALTER TABLE customer CHANGE 字段名 xinming VARCHAR(50); -- 修改表字段

    ALTER TABLE bb CHANGE id xinming VARCHAR(50); 

    修改表字段:bb表名,id 要修改的字段名,xinming修改成的字段名,VARCHAR(50)是修改成的类型,字符串类型

    插入数据(录入数据): customer表名,
    INSERT INTO customer(id,NAME,sex,birthday)VALUE(888,'李四','男','1997-12-9');


    数据类型varchar(字符串) int(整数) char(字符) date datetime  就只有这几种
    补充 tinyint -(整数,但是只有255位 -127 to 128(有符号)0 to 255(无符号) )一般用于年龄



        表约束:
    主键(primary key):物理上存储的顺序
            非空(not null):此字段不允许填写空值

            惟一(unique):此字段的值不允许重复
            
    默认值(default):当不填写此值时会使用默认值,如果填写时以填写为准

            外键(foreign key):维护两个表之间的关联关系






            UNSIGNED
                无符号的
                声明该数据列不允许负数
            ZEROFILL
                0填充的
                不足位数的用0来填充,如 int(3),5则为 005
            AUTO_INCREMENT
                自动增长的,每添加一条数据,自动在上一个记录数上加1
                通常用于设置主键,且为整数类型
                可定义起始值和步长


        -- 查询表数据

         ·  SELECT sid,sname FROM student;
            单字段查询(执行效率高)
            SELECT * FROM student;   
            全表查询

    用*是全表查询(执行效率低),


            条件查询:

        -- 需求一:查询学号为111的学 生信息student 为表名,sid为字段名称


        SELECT * FROM student WHERE sid = 111
    ;


        -- 需求二:查询一个叫老王的同学


        SELECT * FROM student WHERE sname = '老王';



        -- 需求三:查询出姓王的同学(模糊查询)


        SELECT * FROM student WHERE sname LIKE '王%';



            distinct  (在select后面的*前面加,表示去重复)

    --删除表数据

        -- 删除表数据:s为表名,删除sid=222字段

        DELETE FROM s WHERE sid = 222;




    -- 修改表数据s为表名称,sname为修改

        UPDATE  s SET sname = '七七' WHERE sid = 777;

    UPDATE  jj SET NAME="香港" WHERE id=2;     jj为表名,name为字段名修改成香港,条件id等于2的行



    --别名
     
        别名可以运用到列上,也可以运用在表上

     也可以用在函数上
        SELECT sid AS '学号',sname AS '姓名',sbirthday AS '出生日期' FROM 表名;
        改别名数据库:student AS s;



    --条件查询:


        比较运算符:
    等于: =

        大于: >

        大于等于: >=

        小于: <
        
    小于等于: <=
        
        不等于: != 或 <>


    --逻辑运算符:

        and --和
     (要符合所有条件才会筛选出来)
        or  --或者(符合其中任意一项就可以出来)
        
    not --非(no)




    --模糊查询:
    like

        %表示任意多个任意字符
    _表示一个任意字符



    --范围查询:
    in
        表示在一个非连续的范围内

        between ... and ...表示在一个连续的范围内




    --空判断:

        注意:null与''是不同的

        判空is null
    判非空is not null
        (筛选出有空出或者没空出的格子)



    -- order by表示排序,默认是正序排,列名的后面加上desc之后是倒叙排列


        
    SELECT * FROM student ORDER BY sscore;


    -- 需求将学生表里面的学生成绩倒序排列


        SELECT * FROM student ORDER BY sscore DESC;


    -- 聚合函数

    1,统计--count

    2,平均--avg

    3,最大值--max

    4,最小值--mIN

    5,求和--sum



    --精确小数的函数    round(小数点后几位)
    --double(20,2)表示小数类型,20表示20位数字长度,2表示精确到小数点后两位


    --分页查询(limit)
    假设每页m条数据,现在要看n页那么
    select * from 表名 limit (n-1)×m,m;


    --分组(group by)
    统计出男生女生多少人----------select xingbie count(sid) from 表名 group by xingbie




    -- 主外键的作用:
    不是为了进行多表查询,没有主外键照样可以连接起来多表查询
    那么主外键的作用是:主键为了保证数据的唯一性
    ,外键为了保证数据的完整性(主表的数据被从表引用,那么主表里面相关联的数据不能随意更改或删除)



    --

    连接查询:

        1,等值查询

        SELECT * FROM A,B WHERE A.CID = B.CID;

        2,内连接查询

        SELECT * FROM A INNER JOIN B ON a.cid = B.cid
     

        
    外连接查询:左外连接和右外连接

        3,左外链接
        SELECT * FROM A LEFT JOIN B ON a.cid = B.cid

        
    内连接查询和左外连接查询的区别:


        
    -- 内连接查询出分类名称里面的商品
            -- 内连接:没有关联的数据不显示,ctegory 左表连接右表 product ,c和p为了方便起的别名,表c.id=p.cno


        SELECT * FROM category c INNER JOIN product p ON c.cid = p.cno


        -- 左外连接查询出分类名称里面的商品
            --左外连接:没有关联的数据也会显示,右表没有值的数据用null表示.

        SELECT * FROM category c LEFT JOIN product p ON c.cid = p.cno






        事务的定义:(begin)-起始  (commit)-结束,提交  (rollback)- 回滚(撤销)
    把一连串的操作放在一起,要么全部成功,要么全部失败。

    事务的四个特性:原子性、一致性、隔离性、持久性


    事务的作用:保证数据的一致性!


    为什么要这样做:银行转账,有一方转出,另一方由于机械故障未收到钱,那么转出方肯定不干。









        存储过程:
    就是为了可重复的执行操作数据库的 sql 语句的集合.

    存储过程是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的

     sql,
    存储过程作用:
    1,不需要重复编译

    2,减少网络交互

    3,减少网络访问流量


        自关联       意思就是说同一个表分成几个别,这些表都取别名,然后自己向关联,关联相同点。

    - 要查询出广东省里面的市和区(使用左外连接)

    SELECT * FROM areas a LEFT JOIN areas b ON a.aid = b.pid LEFT JOIN areas c  ON c.`pid` = b.`aid`
    WHERE a.aname = '广东省'

    没有不会的技术,只有你想不到的技术。。。。。。。。。。。。。。
  • 相关阅读:
    centos 编程环境
    git 安装 使用
    nodejs 笔记
    微信开发
    composer 使用笔记
    一:安装centos 7最小编程环境 xfce桌面
    二: 安装centos服务环境软件mysql httpd php
    我的通用程序规范及说明
    常用js代码集
    三 , lnmp 一键包安装使用
  • 原文地址:https://www.cnblogs.com/zenghongfei/p/11479868.html
Copyright © 2011-2022 走看看