插入文档 #
一、INSERT语句概述 #
1.1 基本语法 #
sql
INSERT INTO <class> [(<field>[,<field>]*)]
VALUES (<value>[,<value>]*)[, (<value>[,<value>]*)]*
INSERT INTO <class> SET <field> = <value>[, <field> = <value>]*
1.2 INSERT特点 #
text
INSERT特点:
├── 创建新的文档记录
├── 自动生成Record ID
├── 支持批量插入
├── 支持JSON格式
└── 返回插入的记录
二、基本插入 #
2.1 使用VALUES语法 #
sql
INSERT INTO Person (name, age, city) VALUES ('Tom', 30, 'Beijing')
2.2 使用SET语法 #
sql
INSERT INTO Person SET name = 'Tom', age = 30, city = 'Beijing'
2.3 使用JSON语法 #
sql
INSERT INTO Person CONTENT {'name': 'Tom', 'age': 30, 'city': 'Beijing'}
2.4 插入并返回 #
sql
INSERT INTO Person SET name = 'Tom', age = 30 RETURN @rid, name, age
INSERT INTO Person SET name = 'Tom', age = 30 RETURN @this
2.5 插入到指定集群 #
sql
INSERT INTO CLUSTER:person_east (name, age) VALUES ('Tom', 30)
三、插入不同类型数据 #
3.1 基本类型 #
sql
INSERT INTO Person SET
name = 'Tom',
age = 30,
salary = 5000.50,
isActive = true,
birthDate = DATE('1994-01-15'),
createdAt = DATETIME('2024-01-15 10:30:00')
3.2 集合类型 #
sql
INSERT INTO Person SET
name = 'Tom',
hobbies = ['reading', 'coding', 'gaming'],
tags = {'developer', 'java', 'python'},
preferences = {'theme': 'dark', 'language': 'en'}
3.3 嵌入文档 #
sql
INSERT INTO Person SET
name = 'Tom',
address = {
'street': 'Main Street',
'city': 'Beijing',
'zipCode': '100000'
}
3.4 链接类型 #
sql
INSERT INTO Company SET name = 'ABC Corp'
INSERT INTO Person SET
name = 'Tom',
employer = (SELECT FROM Company WHERE name = 'ABC Corp')
3.5 链接集合 #
sql
INSERT INTO Person SET
name = 'Tom',
friends = (SELECT FROM Person WHERE name IN ['Jerry', 'Mike'])
四、批量插入 #
4.1 多VALUES语法 #
sql
INSERT INTO Person (name, age, city) VALUES
('Tom', 30, 'Beijing'),
('Jerry', 25, 'Shanghai'),
('Mike', 35, 'Guangzhou')
4.2 使用UNWIND批量插入 #
sql
LET persons = [
{'name': 'Tom', 'age': 30},
{'name': 'Jerry', 'age': 25},
{'name': 'Mike', 'age': 35}
]
INSERT INTO Person SET name = $persons.name, age = $persons.age
UNWIND $persons
4.3 从查询结果插入 #
sql
INSERT INTO PersonBackup SET name = p.name, age = p.age
FROM (SELECT FROM Person WHERE status = 'active') p
4.4 使用SELECT批量插入 #
sql
INSERT INTO PersonArchive FROM SELECT FROM Person WHERE createdAt < DATE('2023-01-01')
五、条件插入 #
5.1 使用IF条件 #
sql
IF (SELECT COUNT(*) FROM Person WHERE email = 'tom@example.com' = 0) {
INSERT INTO Person SET name = 'Tom', email = 'tom@example.com'
}
5.2 使用UPSERT模式 #
sql
UPDATE Person SET name = 'Tom'
UPSERT
WHERE email = 'tom@example.com'
5.3 使用LET变量 #
sql
LET existing = SELECT FROM Person WHERE email = 'tom@example.com';
IF ($existing.size() = 0) {
INSERT INTO Person SET name = 'Tom', email = 'tom@example.com'
}
六、插入顶点和边 #
6.1 插入顶点 #
sql
CREATE CLASS Person EXTENDS V
INSERT INTO Person SET name = 'Tom', age = 30
或使用CREATE VERTEX:
sql
CREATE VERTEX Person SET name = 'Tom', age = 30
6.2 插入边 #
sql
CREATE CLASS KNOWS EXTENDS E
INSERT INTO KNOWS FROM (SELECT FROM Person WHERE name = 'Tom')
TO (SELECT FROM Person WHERE name = 'Jerry')
SET since = 2020
或使用CREATE EDGE:
sql
CREATE EDGE KNOWS FROM (SELECT FROM Person WHERE name = 'Tom')
TO (SELECT FROM Person WHERE name = 'Jerry')
SET since = 2020
6.3 批量创建边 #
sql
CREATE EDGE WORKS_AT FROM (SELECT FROM Person WHERE employer IS NULL)
TO (SELECT FROM Company WHERE name = 'ABC Corp')
七、从文件导入 #
7.1 从CSV导入 #
sql
INSERT INTO Person FROM CSV '/data/persons.csv'
WITH HEADERS
SET name = string(name), age = integer(age)
7.2 从JSON文件导入 #
sql
LET data = SELECT FROM JSON:'/data/persons.json'
INSERT INTO Person FROM $data
7.3 使用ETL导入 #
json
{
"source": {"file": {"path": "/data/persons.json"}},
"extractor": {"json": {}},
"transformers": [
{"vertex": {"class": "Person"}}
],
"loader": {
"orientdb": {
"dbURL": "plocal:/data/databases/mydb",
"classes": [{"name": "Person"}]
}
}
}
八、使用函数插入 #
8.1 使用内置函数 #
sql
INSERT INTO Person SET
name = 'Tom',
createdAt = sysdate(),
uuid = uuid(),
hash = hash('MD5', 'Tom')
8.2 使用自定义函数 #
sql
INSERT INTO Person SET
name = 'Tom',
code = generateCode('P', 6)
九、插入验证 #
9.1 检查插入结果 #
sql
INSERT INTO Person SET name = 'Tom', age = 30 RETURN @rid, @version
9.2 验证唯一性 #
sql
LET existing = SELECT FROM Person WHERE email = 'tom@example.com';
IF ($existing.size() > 0) {
SELECT 'Email already exists' AS error
} ELSE {
INSERT INTO Person SET name = 'Tom', email = 'tom@example.com' RETURN @rid
}
9.3 事务中插入 #
sql
BEGIN
INSERT INTO Person SET name = 'Tom', age = 30
LET p = SELECT FROM Person WHERE name = 'Tom'
INSERT INTO AuditLog SET action = 'INSERT', recordId = $p[0].@rid, timestamp = sysdate()
COMMIT
十、性能优化 #
10.1 批量插入优化 #
sql
LET batch = [
{'name': 'Person1', 'age': 20},
{'name': 'Person2', 'age': 25},
{'name': 'Person3', 'age': 30}
]
BEGIN
FOREACH ($item IN $batch) {
INSERT INTO Person SET name = $item.name, age = $item.age
}
COMMIT
10.2 使用事务 #
sql
BEGIN
INSERT INTO Person SET name = 'Tom'
INSERT INTO Person SET name = 'Jerry'
INSERT INTO Person SET name = 'Mike'
COMMIT
10.3 禁用索引临时 #
sql
ALTER INDEX Person.name DISABLE
INSERT INTO Person SET name = 'Tom', age = 30
ALTER INDEX Person.name ENABLE
十一、错误处理 #
11.1 常见错误 #
text
常见错误:
├── 违反唯一约束
├── 违反NOTNULL约束
├── 违反MANDATORY约束
├── 类型不匹配
└── 违反范围约束
11.2 错误处理示例 #
sql
TRY {
INSERT INTO Person SET name = 'Tom', email = 'tom@example.com'
} CATCH {
SELECT 'Insert failed: ' + $error AS message
}
十二、实际应用示例 #
12.1 创建用户 #
sql
INSERT INTO User SET
id = uuid(),
username = 'tom_hanks',
email = 'tom@example.com',
password = hash('SHA-256', 'password123'),
status = 'active',
roles = ['user'],
createdAt = sysdate(),
updatedAt = sysdate()
RETURN @rid, id, username
12.2 创建订单 #
sql
BEGIN
LET user = SELECT FROM User WHERE id = 'user_001';
LET order = INSERT INTO Order SET
id = uuid(),
userId = $user[0].@rid,
status = 'pending',
totalAmount = 0,
createdAt = sysdate()
RETURN @rid;
COMMIT
RETURN $order
12.3 创建日志记录 #
sql
INSERT INTO Log SET
level = 'INFO',
message = 'User logged in',
userId = (SELECT FROM User WHERE username = 'tom'),
ip = '192.168.1.1',
timestamp = sysdate()
12.4 批量导入数据 #
sql
LET data = [
{'name': 'Product1', 'price': 100, 'stock': 50},
{'name': 'Product2', 'price': 200, 'stock': 30},
{'name': 'Product3', 'price': 150, 'stock': 80}
]
BEGIN
FOREACH ($item IN $data) {
INSERT INTO Product SET
name = $item.name,
price = $item.price,
stock = $item.stock,
createdAt = sysdate()
}
COMMIT
十三、总结 #
插入文档要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 基本插入 | INSERT INTO … SET | 单条插入 |
| 批量插入 | INSERT INTO … VALUES … | 多条插入 |
| JSON插入 | INSERT INTO … CONTENT | JSON格式 |
| 条件插入 | IF … INSERT | 条件判断 |
| 顶点插入 | CREATE VERTEX | 图顶点 |
| 边插入 | CREATE EDGE | 图边 |
下一步,让我们学习更新文档!
最后更新:2026-03-27