插入文档 #

一、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