在Tar​​antool中通过部分键的一部分使用“ space:delete”的任何方式?

时间:2019-06-03 17:16:55

标签: tarantool

文档说“删除不能与部分键一起使用”。您的建议是如何解决它。例如创建新索引,使用循环删除还是其他方式?

2 个答案:

答案 0 :(得分:1)

您可以使用主键在循环中删除值。

#!/usr/bin/env tarantool

local json = require('json')

local function key_from_tuple(tuple, key_parts)
    local key = {}
    for _, part in ipairs(key_parts) do
        table.insert(key, tuple[part.fieldno] or box.NULL)
    end
    return key
end

box.cfg{}

box.once('init', function()
    box.schema.space.create('s')
    box.space.s:create_index('pk')
    box.space.s:create_index('sk', {
        unique = false,
        parts = {
            {2, 'number'},
            {3, 'number'},
        }
    })
end)

box.space.s:truncate()
box.space.s:insert{1, 1, 1}
box.space.s:insert{2, 1, 1}

print('before delete')
print('---')
box.space.s:pairs():each(function(tuple)
    print(json.encode(tuple))
end)
print('...')

local key_parts = box.space.s.index.pk.parts
for _, tuple in box.space.s.index.sk:pairs({1}) do
    local key = key_from_tuple(tuple, key_parts)
    box.space.s.index.pk:delete(key)
end

print('after delete')
print('---')
box.space.s:pairs():each(function(tuple)
    print(json.encode(tuple))
end)
print('...')

os.exit()

在上面的示例中,常见情况是使用key_from_tuple函数处理的。当您知道哪些字段构成主键时,事情可能会更简单。说,如果它是第一个字段:

for _, tuple in box.space.s.index.sk:pairs({1}) do
    box.space.s.index.pk:delete(tuple[1])
end

在tarantool-2.2.0-255-g22db9c264中添加的新key_def模块(尚未发布,但可从我们的2.2存储库中获得)简化了从元组中提取密钥的情况,尤其是在json路径索引的情况下:

#!/usr/bin/env tarantool

local json = require('json')
local key_def_lib = require('key_def')

box.cfg{}

box.once('init', function()
    box.schema.space.create('s')
    box.space.s:create_index('pk')
    box.space.s:create_index('sk', {
        unique = false,
        parts = {
            {2, 'number', path = 'a'},
            {2, 'number', path = 'b'},
        }
    })
end)

box.space.s:truncate()
box.space.s:insert{1, {a = 1, b = 1}}
box.space.s:insert{2, {a = 1, b = 2}}

print('before delete')
print('---')
box.space.s:pairs():each(function(tuple)
    print(json.encode(tuple))
end)
print('...')

local key_def = key_def_lib.new(box.space.s.index.pk.parts)
for _, tuple in box.space.s.index.sk:pairs({1}) do
    local key = key_def:extract_key(tuple)
    box.space.s.index.pk:delete(key)
end

print('after delete')
print('---')
box.space.s:pairs():each(function(tuple)
    print(json.encode(tuple))
end)
print('...')

os.exit()

source of the code

答案 1 :(得分:1)

从Tarantool 2.1开始,您可以为此使用SQL语法(“从...哪里删除...”)。

但是,请注意,Tarantool会尝试在事务中执行此操作,因此,如果您尝试删除太多的元组,它将锁定事务线程一段时间。