数据库未整理的笔记(5)


mysql> create table user2  select name,uid,gid from user limit 3;

mysql> create table info  select name,uid,homedir,shell from user limit 5;

show  tables;
 
create  or replace view  v1

as  select  
a.name as aname ,
b.name as bname ,
a.uid as auid ,
b.uid as  buid
from user2 a left join info b on a.uid=b.uid;

mysql> create view v2 as select a1.username as aname ,b1.username as bname,a1.uid as auid, b1.uid as buid from a a1 left join b b1 on a1.username=b1.username and a1.uid=b1.uid;






select  * from  v4;

mysql>  create or replace view  v2 as  select  * from user;



select  * from v2;  select



create  view  
v1
as   
select    x,x,x from 表/ 视图
[with  local/cascade check option];
                                                              





create table  a  select  * from user  where  uid < 10;
select   *  from  a;

create  view  va1
as  
select  * from a
where  uid < 8  with  check option;

create view va2
as
select  * from va1
where uid >=5
with local check option;

create view va3
as
select  * from va1
where uid >=5
with cascaded check option;
对创建的试图va1  va2  va3  插入或更新记录的操作。验证限制。

+++++++++++++++++++++++++++++++++
创建名称为say的存储过程,功能查看db9库下user表的前10记录信息。
mysql> delimiter //
mysql> create procedure  say()
begin
     select  * from  db9.user where id<=10;
end
//
mysql> delimiter  ;

调用存储过程
mysql>  call    say;
mysql>  call    say();


查看存储过程
mysql> show  procedure  status\G;
mysql>
select db,name,type from   mysql.proc
where name="say2"\G;

mysql> show  create  procedure  say;

drop   procedure  say;

参数类型

mysql> delimiter //
mysql> create procedure  say2(
IN   username   char(20),
IN  x  int(2)
)
begin
     select  * from  db9.user where name="@username"  and uid=@x;
end
//
mysql> delimiter  ;

call   say2("tom",19)
call   say2("lucy",30)

++++++++++++++++++++++++++++
mysql> delimiter //
mysql> create procedure say2( in username  char(10) )
    -> begin
    -> select  username;
    -> select  * from db9.user where name=username;
    -> end
    -> //
Query OK, 0 rows affected (0.06 sec)

mysql> delimiter ;


mysql>  call  say2;
mysql>  call  say2("bin");
mysql>  call  say2("mysql");
定义局部变量
delimiter //
create procedure say5()
    
begin
    
    declare x int default 11;  
    select x;
 
    select sum(uid) into x from user  where  uid<=100;
 
    select x;
    
end
    
//
delimiter ;

call  say3;  //因为没有参数所以可以不加()



delimiter //
create procedure say5(

in bash char(20),
in  nologin char(25),
out x int ,
out y int

)
begin

    declare z int ;
    
set z=0;
    
select count(name) into  @x from db9.user where shell=bash;      
    select count(name) into  @y from db9.user where shell=nologin;

    set z=@x+@y;
    
select  z;

end
 
//
delimiter ;
call   say5("/bin/bash","/sbin/nologin",@x,@y);


delimiter //
create  procedure say6(in  x  int(1) )
begin
                     
       if  x <= 10 then
                          
           select * from db9.user where id <=x;
                     
       end if;
              
end
              
//
delimiter ;
call   say6(11);
call   say(5);



delimiter  //
create  procedure say10(in  x  int(1) )
begin
                     
       if  x <= 10 then
                          
           select * from db9.user where id <= x;
                     
       end if;
              
end
              
//
delimiter ;

delimiter //create  procedure  p1(in  x int(1) )
              
begin
                  
        if   x is null  then
                      
             set @x = 1;
                      
             select  * from db9.user where id=x;
                  
       end if;
                  
       if  x <= 10 then
                        
            select * from db9.user where id <=x;
                  
       end if;
               
end
              
//
delimiter  ;+++++++++++++++++++++++++++++
delimiter //create  procedure  p2(in  x int(1) )
              
begin
                  
        if   x is null  then
                      
             set @x = 1;
                      
             select  * from userdb.user where id=x;
                  
       else                      
            select * from userdb.user where id <=x;
                  
       end if;
               
end
              
//
delimiter  ;


delimiter //
create  procedure  p7(in  x char(10) )
              
begin
                  
        if   x is null  then
                      
             set @x = "mysql";
   
             select  @x;                   
             select  * from db9.user where name=@x;
        else       
              select  * from db9.user where name=x ;
              select  * from db9.user where name=@x ;                
       end if;
                  
end
              
//
delimiter  ;
call  p7(null);
call  p7("bin");

+++++++++++++++++++++++++++++++++++++++++
循环结构
----while循环结构例子-------------------

//输出数字1到5;
drop procedure  say;
delimiter //
create  procedure p24()
begin
   declare i int;
   set i=1;
   while  i <= 5 do
       select i;
       set i=i+1;
   end while;
end
//
delimiter ;
call  p24();

---------------loop 死循环的例子-------------------
drop procedure  say;


delimiter //
create  procedure say()
begin
    declare i int;
    set i=1;
    loop
       select i;
       set i=i+1;
    end loop;
end
//
delimiter ;

call say();


---------------------定义标签名称 条件匹配时 结束循环--------------------

delimiter //
create  procedure p259()
begin
    declare i int;
    set i=0;
    loab1:loop
       set i=i+1;
       if  i = 5 then
          ITERATE loab1;
       end if;
       if i = 11 then
         LEAVE loab1;
       end if;
       select  i;  
    end loop;
end
//
delimiter ;



drop procedure  say;
delimiter //
 create  procedure say()
begin
declare i int;
set i=1;
loab1:loop  #给loop循环定义标签名称为 loab1
 select i;
  set i=i+1;
    if  i=3  then  #变量i的值加到3的时候 结束循环
     LEAVE loab1;
   end if;
   end loop;
   end
   //

----------------------定义标签名称 条件匹配时 结束当前循环 执行下一次循环--------------------
mysql> drop procedure  say;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter //
mysql> create  procedure say()  #输出数字1到6 但不输出数字3
    -> begin
    -> declare i int;
    -> set i=1;
    -> loab1:loop
    ->    select i;
    ->    set i=i+1;
    ->    if  i=3  then     #i值是3时结束本次循环
    ->       iterate loab1;
    ->    end if;
    ->    if  i=7 then     #i值是7时 结束循环
    -> leave loab1;
    ->    end if;  
    -> end loop;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call say();

---------------------------使用repeat循环输出数字1到5-----------------------
delimiter //
create  procedure p260()
begin
    declare i int;
    set i=1;
    repeat
        select i;
        set i=i+1;
        until  i=6
    end repeat;
end
//
delimiter ;
call p260();

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
drop procedure  say;
delimiter //
create  procedure say()
begin
declare i int;
set i=1;
repeat
   select i;
   set i=i+1;
   until  i=6
end repeat;
end
//
delimiter ;


-------------------一起向表中插入10条记录--------------------
 delimiter //
 create procedure adddata()
     begin
     declare n  int default 0;
    while n<10
     do
     insert into studydb.user(name,uid) values("bob",888);
    set n = n+1;
     end while;
  end
  //




mysql> call adddata();

mysql> select  name,uid from user where name="bob" and uid=888;



----------------------自定义插入记录的行数--------------------------
 drop procedure  say;
delimiter //
 create  procedure say(in  num  int(2) )
    begin
   declare i int;
 set i=1;
 while  i <= num do
    insert into userdb.user(name,gid)values("bob",i);
   set i=i+1;
end while;
 end
 //

mdelimiter ;

call say(3);

mysql> select * from user where name="bob"; #查看是否插入记录
+----+------+------+----------+------+------+---------+---------+-------+
| id | name | sex  | password | pay  | gid  | comment | homedir | shell |
+----+------+------+----------+------+------+---------+---------+-------+
| 45 | bob  | boy  | NULL     | NULL |    1 | NULL    | NULL    | NULL  |
| 46 | bob  | boy  | NULL     | NULL |    2 | NULL    | NULL    | NULL  |
| 47 | bob  | boy  | NULL     | NULL |    3 | NULL    | NULL    | NULL  |
+----+------+------+----------+------+------+---------+---------+-------+
3 rows in set (0.00 sec)



++++++++++++++++++++++++编辑配置文件
[root@localhost ~]# cat /usr/local/mycat/conf/server.xml  #定义连接客户端连接mycat服务使用的用户名和密码及逻辑库的名字
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
    - you may not use this file except in compliance with the License. - You
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
    - - Unless required by applicable law or agreed to in writing, software -
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
    License for the specific language governing permissions and - limitations
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
    <property name="defaultSqlParser">druidparser</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!--
    <property name="processors">1</property>
    <property name="processorExecutor">32</property>
     -->
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
            <property name="processors">32</property> <property name="processorExecutor">32</property>
            <property name="serverPort">8066</property> <property name="managerPort">9066</property>
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
    </system>

    <user name="test">  #连接mycat服务时使用的用户名 test
        <property name="password">test</property>   #使用test用户连接mycat用户时使用的密码
        <property name="schemas">TESTDB</property>  #连接上mycat服务后,可以看到的库名多个时,使用逗号分隔 (是逻辑上的库名)
    </user>

    <user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property> #定义只读权限,使用定义的user用户连接mycat服务后只有读记录的权限
    </user>
    <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property>
        <property name="weight">1</property> </node> </cluster> -->
    <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property>
        </host> </quarantine> -->

</mycat:server>
[root@localhost ~]#

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[root@localhost ~]# cat /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

          <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> #逻辑库名 要与server.xml定义的一样
                 
        
                 <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />  #定义分片的表
                
        
                 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" />  #定义分片的表
                
        
                 <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> #定义分片的表
                 
        
                 <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2" rule="mod-long" /> #定义分片的表
                
        
                 <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />   #定义分片的表
                
        
                 <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> #定义分片的表
                 
          </schema>
    
        <dataNode name="dn1" dataHost="c1" database="db1" />
        #定义分片使用的库,所在的物理主机 ,真正存储数据的db1库在物理主机c1上
    
        <dataNode name="dn2" dataHost="c2" database="db2" />
        #定义分片使用的库,所在的物理主机 ,真正存储数据的db2库在物理主机c2上
    
         #指定c1名称主机对应的ip地址
    <dataHost name="c1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" >
        <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.4.55:3306" user="admin"    
            password="123456">   #访问数据时 mycat服务连接数据库服务器时使用的用户名和密码
        </writeHost>
    </dataHost>

         #指定c2名称主机对应的ip地址
    <dataHost name="c2" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" >
        <heartbeat>select user()</heartbeat>
                <writeHost host="hostM2" url="192.168.4.54:3306" user="admin"
            password="123456">  #访问数据时 mycat服务连接数据库服务器时使用的用户名和密码
        </writeHost>
    </dataHost>
</mycat:schema>
[root@localhost ~]#


++++++++++++++++++++启动服务
 [root@localhost ~]# sed -n  '4,5p' /usr/local/mycat/conf/wrapper.conf
  # Java Application
  wrapper.java.command=java
 [root@localhost ~]#
 [root@localhost ~]# which java
  /usr/bin/java

 [root@localhost ~]#echo  "export PATH=/usr/local/mycat/bin"  >> /etc/profile
 [root@localhost ~]#source  /etc/profile

 [root@localhost ~]# mycat  --help
 Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump }
 [root@localhost ~]#

 [root@localhost ~]# mycat  start
 Starting Mycat-server...
 [root@localhost ~]#
 [root@localhost ~]# netstat -utnalp  | grep :8066
 tcp6       0      0 :::8066                 :::*                    LISTEN      4524/java           
 [root@localhost ~]#


++++++++++++++++++++++++测试MyCAT
[root@room9pc17 ~]# mysql -h192.168.4.56 -P8066 -utest -ptest  //客户端连接mycat服务器,存储数据
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| employee         |
| goods            |
| hotnews          |
| travelrecord     |
+------------------+
6 rows in set (0.00 sec)

MySQL [TESTDB]> MySQL [TESTDB]> create table employee( id int not null primary key, name varchar(100), sharding_id int not null );

MySQL [TESTDB]> MySQL [TESTDB]> insert  into  employee(id,name,sharding_id)values(1,"bob",10000),(2,"lucy",10010),(3,"alice",10000),(4,"jerry",10010);

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mysql> select  @@hostname;
+------------+
| @@hostname |
+------------+
| c1         |
+------------+
1 row in set (0.00 sec)

mysql> select  * from employee;
Empty set (0.00 sec)

mysql> select  * from employee;
+----+-------+-------------+
| id | name  | sharding_id |
+----+-------+-------------+
|  1 | bob   |       10000 |
|  3 | alice |       10000 |
+----+-------+-------------+
2 rows in set (0.00 sec)

mysql>
++++++++++++++++++++++++++++++++++++++++++++++
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| c2         |
+------------+
1 row in set (0.00 sec)

mysql> select * from employee;
Empty set (0.00 sec)

mysql> select * from employee;
+----+-------+-------------+
| id | name  | sharding_id |
+----+-------+-------------+
|  2 | lucy  |       10010 |
|  4 | jerry |       10010 |
+----+-------+-------------+
2 rows in set (0.00 sec)

mysql>


猜你喜欢

转载自blog.csdn.net/weixin_40447206/article/details/81051573