标签 postgresql 下的文章

比如创建一个用户时只有在不存在的时候才需要插入,查了好久,终于搞明白:

```sql
INSERT INTO users(id, alias, email) SELECT 00001, 'faywong', 'wangfei584521@163.com' from users WHERE NOT EXISTS (SELECT * FROM users WHERE id = 00001)
```
pqsql在这点上真叫一个繁琐!

因为要与java后端协作,数据库得建成UTF-8编码的。折腾了半天,实在是没有办法,改了locale,重新安装postgresql-server,最终通过命令行指定编码和模板(这点很重要)这样蒙混过关:

命令行:

```bash
createdb --locale=en_US.utf8 --encoding=UTF8 --template=template0 test_db
```

然后确认下:

![psql_result](/uploads/2015_09_02_01.jpg)

PostgrepSQL 9.4开始支持了jsonb数据类型,从而支持了一部分nosql特性。今天使用了下,简要记录下:

记得在pgadmin中验证下postgresql的版本号:

```sql

SELECT version();

```
确认是9.4以上。

确认之后可以在SQL终端继续感受下:

```sql
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
```
创建一个jsonb类型的字段:

```sql

CREATE TABLE mobile_analysis
(id serial PRIMARY KEY,
datadoc jsonb,
create_at TIMESTAMP WITH TIME ZONE default current_timestamp);

```
其中datadoc是我想存为json格式的字段的名称,为了支持后续的检索,为其创建索引:

```sql

CREATE INDEX idx_mobile_analysis ON mobile_analysis USING gin (datadoc jsonb_path_ops);

```
其中的jsonb_path_ops是为了支持对jsonb字段的值进行检索,条件过滤(比如包含有特定的key-value对的记录)所必需的。

插入一条测试数据:

```sql

INSERT INTO mobile_analysis(datadoc)
VALUES ('{"a": 1, "b":2, "d": "string_val"}');

```
通过包含条件查询之:

```sql

SELECT * FROM mobile_analysis WHERE datadoc @> '{"a":1}'

```
更多的关于json/jsonb类型的函数和操作符的资料请见这里。