[pgsql]仅当主key不存在时插入记录
比如创建一个用户时只有在不存在的时候才需要插入,查了好久,终于搞明白:
```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在这点上真叫一个繁琐!
比如创建一个用户时只有在不存在的时候才需要插入,查了好久,终于搞明白:
```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
```
然后确认下:

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类型的函数和操作符的资料请见这里。