开发者学堂课程【PostgreSQL快速入门:3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/16/detail/89
3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)
内容介绍:
五、PostgreSQL表操作
六、事务操作
七、单条SQL插入多行
五、PostgreSQL表操作
1、SQL Syntax-Lexical Structure
执行sql语句时,分为几个部分。
例子
SELECT * FROM pg_class WHERE relname = 'pg_statistic' LIMIT 1; is one comment
TOKEN
keyword (SELECT FROM WHERE LIMIT)所有的关键字参考数据库手册
identifier or quoted identifier (pg _class relname,表名,列名,对象名..)常量,字符串
默认小写,如需大写需使用双引号,强烈建议不要使用大写,不要用双引号,会引发很多不必要的麻烦。
literal or constant ('pg_ _statistic' 1)
special character symbol (*) 特殊字符,所有的字段
comment (-- is one-line comment) or (/* */ multi-line comment)两个减号后的字符都做注释,多行的注解
operator (=)操作符,对应数据类型的某一个函数
比如1=1的数据类型对应的是int4eq的函数,字符串对应的是texteq。
identifier最大长度受以下限制
define NAMEDATA EN 64 (长度限制,截断到63)比如支持128位的表名,数字改成129即可
truncate_ identifier(char *ident, int len, bool war
n
)
{
if(len >= NAMEDATALEN)
{
len = pg _mbcliplen(ident, len, NAMEDATALEN- 1);
if(warn)
{
Char buf[NAMEDATALEN];
字节的意思
memepy(buf, ident, len);
Buf[len]= \0;
ereport(NOTICE,
(errcode(ERRCODE_NAME_ TOO_ LONG),
errmsg("identifier\"%s\" will be truncated to \"%s\"",
ident, buf)));
}
ident[len] = "\0';
}
}
2、改变最大长度限制,需重新gitdb。改完重新编译。
src/include/pg_ config_ manual.h
/*
* Maximum length for identifiers (e.g. table names, column names,
* function names). Names actually are limited to one less byte than this,
* because the length must include a trailing zero byte.
* Changing this requires an initdb.
*/
#define NAMEDATALEN 64
3、
implicitly-typed literal or constant
常量输入,比如隐式的常量。隐式的转换。
(1)string
E'digoa
\\
'
$$digoal$$
$tag$digoal
\
$tag$
(2)bit string
B'1010101'
(3)number
10 or+10
-23.4
+100.1 or 100.1
10e-1
98e+10 or 98e10
4、explicit-typed literal or constant显式的转换
type 'string'单引号,中间是字符
time '
1
2:00:00'
'string' ::type
'
1
hour'::interval
CAST( 'string' AS type )
CAST('
1
27.0.0.1' AS inet)
;做强制转换
5、操作符
+-*/<>=~!@#%^&|'?||
查询
postgres=# select count(*) from pg_ operator;
count
706
也可以使用这种用法,解析器同样支持。操作符如果是自定义的,不是放在默认的系统下面可以指定它。
SELECT 3 OPERATOR(pg_catalog.+)4;
6、特殊符号
$
string quoted用来把字符串扩起来,作为变量的前导符号
positional parameter in function or prepared statement
Prepare p1 <int> as select*from t where id=$1;
Excute p1<1>;
把p1替换成int,$1表示第一个变量的意思
()
enforce precedence强制的优先级
[]
array selected elements保留特殊字符
,
separate the elements of a list表示把元素分开
;
terminate a SQL结束sql语句
:
slice from array数组下标的分隔符
*
all the fields of a table or composite value所有的表,复合类型
.
numeric , separate schema, table, column names.在数字里面表示一个小数点,复合类型可以column.复合类型的名字。
六、事务操作
事务相关的TOKEN。
BEGIN; -可指定事务隔离级别,事务读写属性,约束延迟校验属性等。
COMMIT;
ROLLBACK;
SAVEPOINT a;
ROLLBACK to a;
二阶事务相关TOKEN,
prepare transaction
rollback prepared回滚掉前面已经结束的rollback prepared的二阶事务
commit prepared提交一个二阶事务
psq|相关的事务模式变量
ON_ ERROR_ ROLLBACK, ON_ ERROR STOP
postgres- # \set ON_ ERROR_ ROLLBACK on
当在prostgre里面执行语句时,在事务中遇到一个错误,都要回滚,还可以继续执行,那条错误相当于直接回避掉。跟ON_ ERROR_ ROLLBACK有关系。如果开启ON_ ERROR ROLLBACK,会在每一句SQL前设置隐形的savepoint,可以继续下面的SQL,而不用全部回滚。
语法已经报错,还可以往t表加数据还可以提交,如果关闭设置成off,再往里面插数据会提示不可以插数据,必须要回滚,否则不能继续下去,会一直报错。
七、单条SQL插入多行
INSERT INTO tbl(
c
1...
cn
) values(...),(...),...,(...);
例如
digoal=# drop table user_ info;
DROP TABLE
digoal =# create table user_ info(id int, info text);
CREATE TABLE
digoal=#insert into user_info(id,info) values( 1,'test')(1'test')(1,test')(1,test'),(1,test);
INSERT0 5
digoal # select ctid,cmin,cmax,xmin,xmax,* from user_ info;
ctid I cmin Icmax I xminI xmax id Iinfo --
几个隐含字段的简单解释,这种sql的好处。Cmin id完全一样就表示值在同一个sql语句上,效率高,批量提交考虑用这种方式
(0,1)I 14I 14 I21673245410I11 Itest
(0,2)I 14I 14I21673245410I11 Itest
(0,3)I 14I 14 I2167324540I11 Itest
(0,4)I 14I 14I216732454 0I11 Itest
(0,5)I 14I 14I216732454 0I11 Itest
(5 rows)