<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
PostgreSQL執行Insert語句時,自動填入時間的功能可以在建立表時實現,但更新表時時間戳不會自動自動更新。
在mysql中可以在建立表時定義自動更新欄位,比如 :
create table ab ( id int, changetimestamp timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP );
那PostgreSQL中怎麼操作呢?
通過觸發器實現,具體如下:
create or replace function upd_timestamp() returns trigger as $$ begin new.modified = current_timestamp; return new; end $$ language plpgsql;
drop table if exists ts; create table ts ( id bigserial primary key, tradeid integer , email varchar(50), num integer, modified timestamp default current_timestamp ); create trigger t_name before update on ts for each row execute procedure upd_timestamp();
測試程式碼:
insert into ts (tradeid,email,num) values (1223,‘mike_zhang@live.com',1); update ts set email=‘Mike_Zhang@live' where tradeid = 1223 ; create unique index ts_tradeid_idx on ts(tradeid); //insert into ts(tradeid,email,num) values (1223,‘Mike_Zhang@live.com',2) on conflict(tradeid) do update //set email = excluded.email,num=excluded.num; select * from ts; – delete from ts;
mysql和pg中的分割區表使用基本類似,同樣都支援hash、range、list三種基本的分割區型別。兩者的區別在於:
mysql:不支援指定預設分割區,最多隻支援2級分割區,不支援表示式分割區。且需要注意,mysql當前除InnoDB或NDB之外的任何儲存引擎都不支援分割區表這一功能,如MyISAM。
pg:pg中可以通過default分割區名的方式指定預設分割區,並且支援多級別的分割區,且支援不同種類分割區的任意組。pg還支援表示式分割區,不過必須得是immutable型別表示式。
除此之外主要注意的是,無論是pg還是mysql都必須pk、uk中包含分割區鍵,因為兩者目前都不支援全域性索引。
offset/limit:
mysql和pg中都支援offset/limit的分頁語法,但是兩者有一點不同:
–mysql
mysql> select * from t1 limit 2,2; +------+------+ | id | ino | +------+------+ | 3 | c | | 4 | d | +------+------+ 2 rows in set (0.00 sec)
–pg
pg中不支援上面這種mysql的寫法
bill=# select * from tbl limit 2,2; ERROR: LIMIT #,# syntax is not supported LINE 1: select * from tbl limit 2,2; ^ HINT: Use separate LIMIT and OFFSET clauses. bill=# select * from tbl limit 2 offset 2; id | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10 ----+----+------+-----+------+---------+-------+----+--------+-------+------- 3 | 92 | 8207 | 167 | 3031 | 363025 | 66793 | 31 | 108702 | 3358 | 46284 4 | 19 | 6982 | 834 | 4278 | 6929072 | 83949 | 80 | 8206 | 25265 | 59691 (2 rows)
型別轉換:
mysql和pg中都支援cast(expression as target_type)的方法去進行型別轉換,但是pg中除此之外還支援value::new_type的方法來進行型別轉換。
bill=# select cast(id as int8) from t1 limit 1; id ---- 1 (1 row) bill=# select id::int8 from t1 limit 1; id ---- 1 (1 row)
upsert/replace:
pg中的upsert作用是當插入資料時:如果不存在則insert,存在則update。
語法為:
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ] [ ON CONFLICT [ conflict_target ] conflict_action ] and conflict_action is one of: DO NOTHING DO UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | ( column_name [, ...] ) = ( sub-SELECT ) } [, ...] [ WHERE condition ]
mysql中使用replace來實現類似的功能。
語法為:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [PARTITION (partition_name [, partition_name] ...)] [(col_name [, col_name] ...)] { {VALUES | VALUE} (value_list) [, (value_list)] ... | VALUES row_constructor_list }
例子:
mysql> CREATE TABLE test ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> data VARCHAR(64) DEFAULT NULL, -> ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -> PRIMARY KEY (id) -> ); Query OK, 0 rows affected (0.02 sec) mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00'); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM test; +----+------+---------------------+ | id | data | ts | +----+------+---------------------+ | 1 | Old | 2014-08-20 18:47:00 | +----+------+---------------------+ 1 row in set (0.00 sec) mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42'); Query OK, 2 rows affected (0.00 sec) mysql> SELECT * FROM test; +----+------+---------------------+ | id | data | ts | +----+------+---------------------+ | 1 | New | 2014-08-20 18:47:42 | +----+------+---------------------+ 1 row in set (0.00 sec)
load data:
mysql中使用load命令來實現載入資料的功能。
語法為:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [PARTITION (partition_name [, partition_name] ...)] [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number {LINES | ROWS}] [(col_name_or_user_var [, col_name_or_user_var] ...)] [SET col_name={expr | DEFAULT}, [, col_name={expr | DEFAULT}] ...]
在pg中我們使用copy命令來實現同樣的功能,copy命令分為伺服器端copy和使用者端的copy協定。
語法為:
COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | PROGRAM 'command' | STDIN } [ [ WITH ] ( option [, ...] ) ] [ WHERE condition ] COPY { table_name [ ( column_name [, ...] ) ] | ( query ) } TO { 'filename' | PROGRAM 'command' | STDOUT } [ [ WITH ] ( option [, ...] ) ]
mysql中索引型別:
pg中的索引型別:
約束:
mysql和pg一樣都支援主鍵約束、外來鍵約束、唯一約束、not null約束等。兩者在約束方面的區別在於:
mysql:check約束不是強制的,即可以建立check約束,但是違反該約束的資料仍然不會報錯;exclude排它約束mysql中不支援。
pg:pg中的check約束是強制的,如果資料不符合check約束則無法插入。並且pg中還支援exclude約束。
use/desc:
mysql中use database_name和desc table_name的快捷命令在pg中也有很方便的命令支援,pg中可以使用:c database_name和d table_name來代替。
除此之外,pg和mysql雖然都支援四種事務隔離級別,但是在pg中read uncommitted的隔離級別是不可用的,這也確保了在pg中不會出現髒讀的現象。
另外在mysql中是存在隱式提交的,即在事務中的DDL語句會被自動提交,而在pg中不會。
例如:
–mysql
可以發現事務回滾後t2表仍然存在,因為已經自動提交了。
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> create table t2(id int); Query OK, 0 rows affected (0.00 sec) mysql> insert into t2 values(222); Query OK, 1 row affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from t2; +------+ | id | +------+ | 222 | +------+ 1 row in set (0.00 sec)
–pg:
而在pg中卻沒有,可以被rollback
bill=# create table tt2(id int); CREATE TABLE bill=# insert into tt2 values(222); INSERT 0 1 bill=# rollback ; ROLLBACK bill=# select * from t2; ERROR: relation "t2" does not exist
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45