MySQL 下發功能SQL

2022-09-14 21:18:18 字數 4814 閱讀 1736

15627.htm

下發,就是從別的表中同步資料到此表中,也可能是來自不同庫的表,或者不同例項的表

下發的邏輯要求:如果沒有則是做插入,存在衝突的記錄,則需要覆寫更新,同時下發表要做出標記,不能重複下發,下發過的記錄要做標記

a表:

create

table

`a` (

`id`

intnot

null

auto_increment,

`a`

varchar(36) collate utf8mb4_general_ci default

null

, `b`

varchar(36) collate utf8mb4_general_ci default

null

, `c`

varchar(36) collate utf8mb4_general_ci default

null,

primary

key(`id`)

) engine

=innodb auto_increment=

10default charset=utf8mb4 collate=utf8mb4_general_ci;

b表:

create

table

`b` (

`id`

intnot

null

auto_increment,

`d`

varchar(36) collate utf8mb4_general_ci default

null

, `e`

varchar(36) collate utf8mb4_general_ci default

null

, `f`

varchar(36) collate utf8mb4_general_ci default

null,

primary

key(`id`)

) engine

=innodb auto_increment=

16default charset=utf8mb4 collate=utf8mb4_general_ci;

首先a插入資料,然後下發給b表:

insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (1, '

1', '

1', '1'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (2, '

2', '

2', '2'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (3, '

3', '

3', '3'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (4, '

4', '

4', '4'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (5, '

5', '

5', '5'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (6, '

6', '

6', '6'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (7, '

7', '

7', '7'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (8, '

8', '

8', '8'

);insert

into `my-info`.`a` (`id`, `a`, `b`, `c`) values (9, '

9', '

9', '

9');

b表為空,則可以直接向裡面插入即可:(把a的全部資料向b表寫入,主鍵為自增,不需要加入)

insert

into `my-info`.`b` (`d`, `e`, `f`) select `a`, `b`, `c` from `my-info`.`a`

現在a和b表一樣的資料, 更新一條a表的資料:

update `my-info`.`a` set `a` =

'100

', `b` =

'100

', `c` =

'100

'where `id` =

5;

a表 5id的記錄是100

+

----+-----+-----+-----+

| id | a | b | c |+--

--+-----+-----+-----+|1

|1|1

|1||

2|2|

2|2|

|3|3

|3|3

||4|

4|4|

4||5|

100|

100|

100|

|6|

6|6|

6||7

|7|7

|7||

8|8|

8|8|

|9|9

|9|9

|+----+-----+-----+-----+

9 rows in

set (0.04 sec)

把a的表記錄下發到b表,操作:(全選a表的記錄,包括主鍵或者約束鍵欄位,寫入到b表中,在主鍵發生衝突時,更新字段)

insert

into `my-

info`.`b` (`id`, `d`, `e`, `f`)

select `id`, `a`, `b`, `c` from `my-info`.`a`

on duplicate key

update `d` = `a`, `e` = `b`, `f` = `c`

sql語法是支援的

> affected rows: 2

檢視b表,結果是修改了五id的記錄

mysql>

select

*from `my-

info`.`b`;+--

--+-----+-----+-----+

| id | d | e | f |+--

--+-----+-----+-----+|1

|1|1

|1||

2|2|

2|2|

|3|3

|3|3

||4|

4|4|

4||5|

100|

100|

100|

|6|

6|6|

6||7

|7|7

|7||

8|8|

8|8|

|9|9

|9|9

|+----+-----+-----+-----+

9 rows in

set (0.07 sec)

a表再追加乙個下發標記字段,在執行下發sql的時候,篩選這個下發條件

insert

into `my-

info`.`b` (`id`, `d`, `e`, `f`)

select `id`, `a`, `b`, `c` from `my-info`.`a`where `下發標記字段` =

'未下發的狀態值

'on duplicate key

update `d` = `a`, `e` = `b`, `f` = `c`

執行下發之後,要更新a表的下發狀態:

把標記為未下發的記錄,更新為已下發

update `my-info`.`a` set `下發標記字段` =

'已下發的狀態值

'where `下發標記字段` =

'未下發的狀態值

';

以避免重複進行下發,或者是業務邏輯指定的區分方式來實現

on duplicate key

update

更新操作是依據這個sql組合實現,即重複的key

key可以是主鍵,或者是索引。

主表的單列主鍵不需要下發到下發表,但是需要其他其他關鍵字段觸發duplicate key 

可以對欄位新增唯一索引實現(唯一索引允許欄位null值,需要字段設定not null限制)

alter

table `table_name` add

unique unq_col1_col2 (`column1`, `column1`);

通過unique索引觸發 duplicate實現更新操作

刪除索引:

drop

index index_name on

table_name ;

alter

table table_name drop

index index_name ;

Mysql商城收藏功能 mysql收藏功能開發

你需要了解join操作 至於主鍵,你可以用user id和article id一起作為復合主鍵,最簡單的作法如下 假定你的使用者id和文章id不變。當然一般是不變的 create table shoucang table user id int 11 article id int 11 create...

置頂的功能sql

增加一列 這一列的備註說明資訊 alter table 表名 add 增加的列名 datetime comment 頂置 after 跟在哪乙個列後面 做頂置排序的時候增加一列 時間列 先看這個看這個頂置列是不是空的,將不為空的先 倒序,如果為空按照建立時間倒序排列 select from 表名 o...

Mysql功能函式

1.concat 最常用的字串拼接方法,但遇到拼接中的字串出現null的情況會返回null 語法 concat string1,string2 例子 select concat s name,s from student 2.concat ws 比concat的優點,多了個分隔符功能,如果某個字串為...