脚本中的delete和解释器给出了不同的结果为什么?

问题描述

脚本功能

function test_delete(val)
    local result = Box.space.upbx_test_redirections.index.name_index:delete(val)
    return result
end

我得到:"message":"Get() doesn't support partial keys and non-unique indexes"。 如果我从口译员那里打电话,一切都很好,我得到了元组。选择我的索引

name_index:   3: &3
    unique: true
    parts:
    - type: string
      is_nullable: false
      fieldno: 4
    id: 3
    type: TREE
    space_id: 517
    name: name_index
  bucket_id: *1
  index_name: *3
  ID: *0
  secondary: *2

测试值:1234567890abcdefghijkl0987654321_uuid

用于创建空间的代码

local upbx_test_redirections = Box.schema.space.create(
        "upbx_test_redirections",{
            format = {
                {"ID","integer"},{"bucket_id","unsigned"},{"test1","string"},{"test2",{"test3",{"test4",{"test5",{"test6",{"test7",{"test8",{"test9",{"test10",},if_not_exists = true,}
    )

和索引:

upbx_test_redirections:create_index(
    "name_index",{
        parts = {"test2"},unique = true,}
)

解决方案:在所有情况下都需要更改。

解决方法

我建议您再次修改架构。 我的假设-先前您创建了非唯一索引,然后只需将unique=false修改为unique=true

tarantool> upbx_test_redirections:create_index(
         >     "name_index",>     {
         >         parts = {"test2"},>         unique = false,>         if_not_exists = true,>     }
         > )
---
- unique: false
  parts:
  - type: string
    is_nullable: false
    fieldno: 4
  id: 1
  space_id: 512
  type: TREE
  name: name_index
...

tarantool> upbx_test_redirections:create_index(
         >     "name_index",>         unique = true,>     }
         > )
---
- unique: false    -- unique option isn't changed
  parts:
  - type: string
    is_nullable: false
    fieldno: 4
  id: 1
  space_id: 512
  type: TREE
  name: name_index
- not created
...

请参阅我的示例,其中可能会遇到错误。

box.cfg{}
s = box.schema.space.create('test')
s:format({{name = 'id',type = 'unsigned'},{name = 'value',type = 'string'}})
-- Unique primary index
s:create_index('pk',{unique = true,parts = {{field = 'id',is_nullable = false}}})
-- Unique secondary index
s:create_index('sk',parts = {{field = 'value',is_nullable = false}}})
-- Unique multipart index
s:create_index('multipart',is_nullable = false},{field = 'value',is_nullable = false}}})
-- Non-unique multipart indexes
s:create_index('multipart_non_unique',{unique = false,is_nullable = false}}})

-- Test data
s:replace{1,'1'}
s:replace{2,'2'}
s:replace{3,'3'}
s:replace{4,'4'}
s:replace{5,'5'}

-- Examples with errors
box.space.test:delete({1}) -- OK
box.space.test.index['pk']:delete({2}) -- OK
box.space.test.index['pk']:delete(2) -- OK
box.space.test.index['pk']:delete(nil) -- Fail
box.space.test.index['sk']:delete('3') -- OK
box.space.test.index['sk']:delete({'3'}) -- OK
box.space.test.index['multipart']:delete({4}) -- Fail: Invalid key part count in an exact match (expected 2,got 1)
box.space.test.index['multipart']:delete({4,'4'}) -- OK
box.space.test.index['multipart_non_unique']:delete({5}) -- Fail: Get() doesn't support partial keys and non-unique indexes
box.space.test.index['multipart_non_unique']:delete({5,'5'}) -- Fail: Get() doesn't support partial keys and non-unique indexes

如果问题仍然存在,请report a bug