使用控制台插入表数据

了解如何从 NoSQL 控制台将数据插入 Oracle NoSQL Database Cloud Service 表。

通过 NoSQL 控制台,您可以在以下模式下将新行插入 Oracle NoSQL Database Cloud Service 表中:
  1. 简单输入模式:您可以使用此模式以声明方式为新行提供值。
  2. 高级 JSON 输入模式:您可以使用此模式为新行提供 JSON 格式的值。
  3. 可以使用 INSERT 语句添加行。在 NoSQL>> 表下,选择要添加行的表。在浏览数据下,在为 SQL 语句提供的文本框中添加 INSERT 语句并执行命令。
  4. 您还可以通过浏览器将数据从本地文件批量上载到表中。

注:如果表是全局活动表,则在一个区域中添加数据也会将数据添加到所有区域表副本。

将数据插入表:简单输入模式

了解如何使用简单输入插入模式将数据插入 Oracle NoSQL Database Cloud Service 表。

向表中插入数据:
  1. Infrastructure Console 访问 NoSQL 控制台。请参阅从基础结构控制台访问服务
  2. NoSQL 控制台列出租户中的所有表。要查看表详细信息,请执行以下操作之一:
    • 单击表名,或
    • 单击与表名对应的操作菜单,然后选择查看详细信息
    此时将打开“表详细信息”页。
  3. 单击插入行
  4. 在“插入行”窗口中,选择输入模式简单输入
  5. 将列出表中的所有列。输入表各列的数据。对于某些列类型(如二进制),可以上载数据。

    注意:

    必须为表的所有不可为空值列输入值。
  6. 单击插入行
    记录已插入表中。
要查看当前页面的帮助,请单击页面顶部的帮助链接。

将数据插入到表中:高级 JSON 输入模式

了解如何使用高级 JSON 输入模式将数据插入 Oracle NoSQL Database Cloud Service 表。

向表中插入数据:
  1. Infrastructure Console 访问 NoSQL 控制台。请参阅从基础结构控制台访问服务
  2. NoSQL 控制台列出租户中的所有表。要查看表详细信息,请执行以下操作之一:
    • 单击表名,或
    • 单击与表名对应的操作菜单,然后选择查看详细信息
    此时将打开“表详细信息”页。
  3. 单击插入行
  4. 在“插入记录”窗口中,为进入模式选择高级 JSON 输入
  5. 以 JSON 格式粘贴或上载记录定义。
  6. 单击插入行
    记录已插入表中。
要查看当前页面的帮助,请单击页面顶部的帮助链接。

使用 SQL 命令插入数据

INSERT 语句用于构造新行并将其添加到指定的表中。

可以在表名后面指定可选列。此列表包含表列子集的列名。子集必须包括所有主键列。如果没有列列表,则默认列列表是按顺序包含表的所有列的列表,它们在 CREATE TABLE 语句中指定。

列列表中的列与 VALUES 子句后列出的表达式(或 DEFAULT 关键字)相对应(如果表达式/DEFAULT 的数量与列数不同,则会引发错误)。这些表达式/默认值用于计算新行中关联列的值。如果表达式返回多个项,则会引发错误。如果表达式未返回任何结果,则使用该表达式的结果为 NULL。如果 DEFAULT 关键字不是表达式出现在 VALUES 列表中,则关联列的默认值将用作新行中该列的值。当列列表中的列数小于表中的列总数时,默认值也用于缺少的列。

示例 1:BaggageInfo 表中插入提供所有列值的行:
INSERT INTO BaggageInfo VALUES(
1762392196147,
"Birgit Naquin",
"M",
"165-742-5715",
"QD1L0T",
[ {
    "id" : "7903989918469",
    "tagNum" : "17657806240229",
    "routing" : "JFK/MAD",
    "lastActionCode" : "OFFLOAD",
    "lastActionDesc" : "OFFLOAD",
    "lastSeenStation" : "MAD",
    "flightLegs" : [ {
      "flightNo" : "BM495",
      "flightDate" : "2019-03-07T07:00:00Z",
      "fltRouteSrc" : "JFK",
      "fltRouteDest" : "MAD",
      "estimatedArrival" : "2019-03-07T14:00:00Z",
      "actions" : [ {
        "actionAt" : "MAD",
        "actionCode" : "Offload to Carousel at MAD",
        "actionTime" : "2019-03-07T13:54:00Z"
      }, {
        "actionAt" : "JFK",
        "actionCode" : "ONLOAD to MAD",
        "actionTime" : "2019-03-07T07:00:00Z"
      }, {
        "actionAt" : "JFK",
        "actionCode" : "BagTag Scan at JFK",
        "actionTime" : "2019-03-07T06:53:00Z"
      }, {
        "actionAt" : "JFK",
        "actionCode" : "Checkin at JFK",
        "actionTime" : "2019-03-07T05:03:00Z"
      } ]
    } ],
    "lastSeenTimeGmt" : "2019-03-07T13:51:00Z",
    "bagArrivalDate" : "2019-03-07T13:51:00Z"
  } ]
)

示例 2:通过指定 DEFAULT 子句在执行 INSERT 语句时跳过某些数据。

可以通过指定 "DEFAULT" 跳过某些列的数据。
INSERT INTO BaggageInfo VALUES(
1762397286805,
"Bonnie Williams",
DEFAULT,
DEFAULT,
"CZ1O5I",
[ {
    "id" : "79039899129693",
    "tagNum" : "17657806216554",
    "routing" : "SFO/ORD/FRA",
    "lastActionCode" : "OFFLOAD",
    "lastActionDesc" : "OFFLOAD",
    "lastSeenStation" : "FRA",
    "flightLegs" : [ {
      "flightNo" : "BM572",
      "flightDate" : "2019-03-02T05:00:00Z",
      "fltRouteSrc" : "SFO",
      "fltRouteDest" : "ORD",
      "estimatedArrival" : "2019-03-02T09:00:00Z",
      "actions" : [ {
        "actionAt" : "SFO",
        "actionCode" : "ONLOAD to ORD",
        "actionTime" : "2019-03-02T05:24:00Z"
      }, {
        "actionAt" : "SFO",
        "actionCode" : "BagTag Scan at SFO",
        "actionTime" : "2019-03-02T04:52:00Z"
      }, {
        "actionAt" : "SFO",
        "actionCode" : "Checkin at SFO",
        "actionTime" : "2019-03-02T03:28:00Z"
      } ]
    }, {
      "flightNo" : "BM582",
      "flightDate" : "2019-03-02T05:24:00Z",
      "fltRouteSrc" : "ORD",
      "fltRouteDest" : "FRA",
      "estimatedArrival" : "2019-03-02T13:24:00Z",
      "actions" : [ {
        "actionAt" : "FRA",
        "actionCode" : "Offload to Carousel at FRA",
        "actionTime" : "2019-03-02T13:20:00Z"
      }, {
        "actionAt" : "ORD",
        "actionCode" : "ONLOAD to FRA",
        "actionTime" : "2019-03-02T12:54:00Z"
      }, {
        "actionAt" : "ORD",
        "actionCode" : "OFFLOAD from ORD",
        "actionTime" : "2019-03-02T12:30:00Z"
      } ]
    } ],
    "lastSeenTimeGmt" : "2019-03-02T13:18:00Z",
    "bagArrivalDate" : "2019-03-02T13:18:00Z"
  } ]
)

示例 3:指定列名并跳过插入语句中的列。

如果只有某个表的一些列有数据,可以在 INSERT 子句中指定列名,然后在 "VALUES" 子句中指定对应的值。
INSERT INTO BaggageInfo(ticketNo, fullName,confNo,bagInfo) VALUES(
1762355349471,
"Bryant Weber",
"LI7N1W",
[ {
    "id" : "79039899149056",
    "tagNum" : "17657806234185",
    "routing" : "MEL/LAX/MIA",
    "lastActionCode" : "OFFLOAD",
    "lastActionDesc" : "OFFLOAD",
    "lastSeenStation" : "MIA",
    "flightLegs" : [ {
      "flightNo" : "BM114",
      "flightDate" : "2019-03-01T12:00:00Z",
      "fltRouteSrc" : "MEL",
      "fltRouteDest" : "LAX",
      "estimatedArrival" : "2019-03-02T02:00:00Z",
      "actions" : [ {
        "actionAt" : "MEL",
        "actionCode" : "ONLOAD to LAX",
        "actionTime" : "2019-03-01T12:20:00Z"
      }, {
        "actionAt" : "MEL",
        "actionCode" : "BagTag Scan at MEL",
        "actionTime" : "2019-03-01T11:52:00Z"
      }, {
        "actionAt" : "MEL",
        "actionCode" : "Checkin at MEL",
        "actionTime" : "2019-03-01T11:43:00Z"
      } ]
    }, {
      "flightNo" : "BM866",
      "flightDate" : "2019-03-01T12:20:00Z",
      "fltRouteSrc" : "LAX",
      "fltRouteDest" : "MIA",
      "estimatedArrival" : "2019-03-02T16:21:00Z",
      "actions" : [ {
        "actionAt" : "MIA",
        "actionCode" : "Offload to Carousel at MIA",
        "actionTime" : "2019-03-02T16:18:00Z"
      }, {
        "actionAt" : "LAX",
        "actionCode" : "ONLOAD to MIA",
        "actionTime" : "2019-03-02T16:12:00Z"
      }, {
        "actionAt" : "LAX",
        "actionCode" : "OFFLOAD from LAX",
        "actionTime" : "2019-03-02T16:02:00Z"
      } ]
    } ],
    "lastSeenTimeGmt" : "2019-03-02T16:09:00Z",
    "bagArrivalDate" : "2019-03-02T16:09:00Z"
  } ]
)
示例 4:stream_acct 表中插入提供所有列值的行:
INSERT INTO stream_acct VALUES(
1,
"AP",
"2023-10-18",
{
   "firstName": "Adam",
   "lastName": "Phillips",
   "country": "Germany",
   "contentStreamed": [{
      "showName": "At the Ranch",
      "showId": 26,
      "showtype": "tvseries",
      "genres": ["action", "crime", "spanish"],
      "numSeasons": 4,
      "seriesInfo": [{
         "seasonNum": 1,
         "numEpisodes": 2,
         "episodes": [{
            "episodeID": 20,
            "episodeName": "Season 1 episode 1",
            "lengthMin": 85,
            "minWatched": 85,
            "date": "2022-04-18"
         },
         {
            "episodeID": 30,
            "lengthMin": 60,
            "episodeName": "Season 1 episode 2",
            "minWatched": 60,
            "date": "2022 - 04 - 18 "
         }]
      },
      {
         "seasonNum": 2,
         "numEpisodes": 2,
         "episodes": [{
            "episodeID": 40,
            "episodeName": "Season 2 episode 1",
            "lengthMin": 50,
            "minWatched": 50,
            "date": "2022-04-25"
         },
         {
            "episodeID": 50,
            "episodeName": "Season 2 episode 2",
            "lengthMin": 45,
            "minWatched": 30,
            "date": "2022-04-27"
         }]
      },
      {
         "seasonNum": 3,
         "numEpisodes": 2,
         "episodes": [{
            "episodeID": 60,
            "episodeName": "Season 3 episode 1",
            "lengthMin": 50,
            "minWatched": 50,
            "date": "2022-04-25"
         },
         {
            "episodeID": 70,
            "episodeName": "Season 3 episode 2",
            "lengthMin": 45,
            "minWatched": 30,
            "date": "2022 - 04 - 27 "
         }]
      }]
   },
   {
      "showName": "Bienvenu",
      "showId": 15,
      "showtype": "tvseries",
      "genres": ["comedy", "french"],
      "numSeasons": 2,
      "seriesInfo": [{
         "seasonNum": 1,
         "numEpisodes": 2,
         "episodes": [{
            "episodeID": 20,
            "episodeName": "Bonjour",
            "lengthMin": 45,
            "minWatched": 45,
            "date": "2022-03-07"
         },
         {
            "episodeID": 30,
            "episodeName": "Merci",
            "lengthMin": 42,
            "minWatched": 42,
            "date": "2022-03-08"
         }]
      }]
   }]
});

上载表行

通过“表详细信息”页中的上载数据按钮,可以通过浏览器将数据从本地文件批量上载到表中。

上载功能用于加载少于几千行。此功能非常适合执行概念验证 (POC) 或对服务进行基本测试。这是填充小表的一种便捷方式。如果要编写数万行,出于性能方面的考虑,最好使用 Oracle NoSQL Database Migrator 或使用 NoSQL SDK 编写您自己的程序。但是,如果要快速插入几百行或几千行,则此上载方法是一种快速方法。

要上载的文件必须包含一系列 JSON 对象。对象可以表示为单个数组的逗号分隔项,也可以表示为由大括号绑定的简单对象序列,它们之间没有语法分隔符。每个对象的内容都必须正确设置 JSON 格式,并且必须符合将要上载到的表的方案。

示例:使用以下 DDL 语句创建表
CREATE TABLE Simple ( id integer, val string, PRIMARY KEY ( id ) )
以下示例说明了如何对文件内容使用数组格式。

[
  {
    "id": 0,
    "val": "0"
  },
  {
    "id": 1,
    "val": "2"
  }, ...
]
以下示例说明如何为文件内容使用简单对象。

{
  "id": 0,
  "val": "0"
}
{
  "id": 1,
  "val": "2"
}, ...
  • 如果表的方案不需要列值,则相应的 JSON 属性可能会被排除在外。
  • 如果列值为“始终生成”,则必须忽略相应的 JSON 属性。
  • 如果 JSON 对象包含名称与任何列名称都不匹配的属性,则会忽略这些属性。

要使用上载功能,请单击上载数据按钮,然后选择要上载的文件。上载立即开始,进度将显示在页面上。成功完成后,将显示插入的总行数。您可以通过单击停止上载按钮中断上载。将显示成功提交到数据库的行数。

如果检测到输入文件中的错误,则上载将停止,并显示包含近似行号的错误消息。输入错误可能是由于 JSON 语法或方案不一致造成的。在请求服务期间也会发生错误。此类错误还会停止上载并显示消息。

请考虑具有以下方案的示例表:
CREATE TABLE IF NOT EXISTS NDCStable (id INTEGER, name STRING, email STRING, age INTEGER, income DOUBLE, PRIMARY KEY(SHARD(id)))
下表列出了输入文件中的一些常见错误以及数据上载期间的相应错误处理。

表 - 加载期间处理错误

输入文件中的问题 错误处理
其中一行中的非 JSON 文本
{"id":1,"name":"Jane Smith","email":"iamjane@somemail.co.us","age":30,"income":30000.0}
missed a line
{"id":2,"name":"Adam Smith","email":"adam.smith@mymail.com","age":25,"income":25000.0}

系统将忽略文本并继续上载。成功将所有行加载到表中后,将显示一条成功消息。

在此示例中,将跳过文本“missed a line”,并成功加载标识为 1 和 2 的两行。

复制主键条目
{"id":2,"name":"Adam Smith","email":"adam.smith@mymail.com","age":25,"income":25000.0}
{"id":2,"name":"Jennifer Smith","email":"jenny1_smith@mymail.com","age":35,"income":35000.0}
{"id":5,"name":"Noelle Smith","email":"noel21@somemail.co.us","age":40,"income":40000.0}

系统将跳过重复的行条目并继续上载。成功加载所有行后,将显示一条成功消息。

在此示例中,将 ID 为 2 的第一行加载到表中。跳过包含重复标识值 2 的第二行。已成功上载所有其他行。

JSON 格式不正确
{"id":7,"name":"Tom Smith","email":"reachtom12@mymail.com","age":65,"income":65000.0}
{"id":8,"name":"Jack Smith","email":"iamjacksmi@somemail.co.us","age":60,"income":30000.0
{"id":9,"fame":"Jane Smith""email":"iamjanesmi@somemail.co.us","age":56,"income":35000.0}

检测到错误行时,系统会停止上载。此时将显示一条错误消息,指示意外的文件结尾及其近似行号。

在此示例中,存在两个 JSON 格式错误。标识为 8 的行缺少右大括号,标识 9 在两个 JSON 字段之间缺少逗号。这两个条目都不符合导致上载失败的 JSON 数据类型格式。只有 ID 为 7 的行成功加载到表中。

注意:

上载操作在检测到输入文件中的第一个错误或不一致实例时停止。
行中缺少主键
{"id":2,"name":"Adam Smith","email":"adam.smith@mymail.com","age":25,"income":25000.0}
{"name":"Jennifer Smith","email":"jenny1_smith@mymail.com","age":35,"income":35000.0}
{"id":5,"name":"Noelle Smith","email":"noel21@somemail.co.us","age":40,"income":40000.0}

检测到错误行时,系统会停止上载。此时将显示一条错误消息,指示主键必须具有值。

在此示例中,第二行不包括导致错误的主键字段。只有 ID 为 2 的行成功加载到表中。

模式不合格 - 缺少、不正确或其他字段
{"id":6,"name":"Yera Smith","email":"ys1982@mymail.com","age":55,"income":55000.0}
{"id":7,"fname":"Tom Smith","email":"reachtom12@mymail.com","age":65,"income":65000.0}
{"id":8,"email":"iamjacksmi@somemail.co.us","age":60,"income":30000.0}

如果输入文件中缺少主键以外的字段,则数据会成功上载。此时将显示一条消息,表明命令运行成功。缺少的字段将填充 null 值。

在此示例中,ID 为 7 的行中的字段名称拼写错误,ID 为 8 的行中缺少字段 name。在这两种情况下,所有行都会成功加载到表中。name 字段将更新为 null 值。

如果由于任何原因在中间停止上载,您可以执行以下操作之一:
  • 如果没有包含生成的键值的列(即,如果键完全由 JSON 文件决定),则只需使用同一文件重新开始。将再次编写已经编写的行。
  • 如果存在生成的关键字值,则重新开始将写入新记录,而不是覆盖现有记录。最简单的方法是删除表并重新创建表。
  • 或者,可以通过执行浏览数据表单中的语句 DELETE FROM tablename 从表中删除所有记录。

如果在上载过程中超出了预配的写入限制,则会显示一条指示此限制的瞬态消息,并且将减慢上载速度以避免再次超出限制。