使用控制台插入表数据
了解如何从 NoSQL 控制台将数据插入到 Oracle NoSQL Database Cloud Service 表中。
通过 NoSQL 控制台,您可以在以下模式下向 Oracle NoSQL Database Cloud Service 表中插入新行:
-
简单输入模式:您可以使用此模式以声明方式为新行提供值。
-
Advanced JSON Input Mode: You can use this mode to provide the values for the new rows in JSON format.
-
可以使用 INSERT 语句添加一行。在 NoSQL"Tables(NoSQL 表)下,选择要在其中添加行的表。在 Explore Data(浏览数据)下,在为 SQL 语句提供的文本框中添加 INSERT 语句并执行命令。
-
您还可以通过浏览器将本地文件中的数据批量上载到表中。
注:如果表是全局活动表,则在一个区域中添加数据还会将数据添加到所有区域表副本。
将数据插入表中:简单输入模式
了解如何使用简单输入插入模式将数据插入到 Oracle NoSQL Database Cloud Service 表中。
要向表中插入数据,请执行以下操作:
-
从基础结构控制台访问 NoSQL 控制台。请参阅从基础结构控制台访问服务。
-
NoSQL 控制台会列出租户中的所有表。要查看表详细信息,请执行以下操作之一:
-
单击表名,或者
-
单击与表名对应的操作菜单,然后选择查看详细信息。
此时将打开“表详细信息”页。
-
-
单击插入行。
-
在“插入行”窗口中,为条目模式选择简单输入。
-
此时将列出表中的所有列,为表中的列输入数据。对于某些列类型(如二进制),可以上载数据。
注:对于表的所有不可为空列,必须输入值。
-
单击插入行。
记录将插入表中。
要查看当前页面的帮助,请单击页面顶部的帮助链接。
将数据插入表中:高级 JSON 输入模式
了解如何使用高级 JSON 输入模式将数据插入 Oracle NoSQL Database Cloud Service 表。
要向表中插入数据,请执行以下操作:
-
从基础结构控制台访问 NoSQL 控制台。请参阅从基础结构控制台访问服务。
-
NoSQL 控制台会列出租户中的所有表。要查看表详细信息,请执行以下操作之一:
-
单击表名,或者
-
单击与表名对应的操作菜单,然后选择查看详细信息。
此时将打开“表详细信息”页。
-
-
单击插入行。
-
在“插入记录”窗口中,为进入模式选择高级 JSON 输入。
-
以 JSON 格式粘贴或上载记录定义。
-
单击插入行。
记录将插入表中。
要查看当前页面的帮助,请单击页面顶部的帮助链接。
使用 SQL 命令插入数据
INSERT 语句用于构建新行并将其添加到指定的表中。
可选列可以在表名后指定。此列表包含表列子集的列名。子集必须包括所有主键列。如果不存在列列表,则默认列列表是按顺序包含表所有列的列,这些列在 CREATE TABLE 语句中指定。
列列表中的列对应于 VALUES 子句之后列出的表达式(或 DEFAULT 关键字)(如果表达式数/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:在执行 INSERT 语句时,通过指定 DEFAULT 子句跳过某些数据。
可以通过指定“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 语句中的列。
如果仅表中的某些列有数据,可以在 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 属性可能会被省略。
-
如果列值为 GENERATED ALWAYS,则相应的 JSON 属性必须省略。
-
如果 JSON 对象包含名称与任何列名称都不匹配的属性,则会忽略这些属性。
要使用上载功能,请单击上载数据按钮,然后选择要上载的文件。上载将立即开始,进度将显示在页面上。成功完成后,将显示插入的总行数。您可以通过单击停止上载按钮来中断上载。将显示成功提交到数据库的行数。
如果检测到输入文件中的错误,则上载将停止,并显示具有近似行号的错误消息。输入错误可能是由错误的 JSON 语法或模式不一致导致的。在请求服务期间也会出现错误。此类错误也会停止上载并显示消息。
请考虑具有以下方案的示例表:
CREATE TABLE IF NOT EXISTS NDCStable (id INTEGER, name STRING, email STRING, age INTEGER, income DOUBLE, PRIMARY KEY(SHARD(id)))
下表列出了输入文件中的一些常见错误以及数据上载期间的相应错误处理。
上载期间处理错误
案例 1:行之一中的非 JSON 文本
输入文件中的问题:
行包含两个有效 JSON 记录之间的非 JSON 文本(例如 missed a line)。
{"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 的两行。
案例 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}
处理时出错:
系统将跳过重复的行条目并继续上载。成功加载所有行后,将显示一条成功消息。
在本例中,标识为 2 的第一行将加载到表中。将跳过包含重复 ID 值 2 的第二行。已成功上载其他所有行。
案例 3:JSON 格式不正确
输入文件中的问题:
输入文件包含 JSON 格式错误的行。例如,一行可能缺少两个 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 数据类型格式。只有标识为 7 的行才能成功加载到表中。
注:在检测输入文件中的第一个错误或不一致实例时,将停止上载操作。
案例 4:行中缺少主键
输入文件中的问题:
输入文件中的行不包括主键字段。
{"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}
处理时出错:
系统在检测到错误行时将停止上载。此时将显示一条错误消息,指示主键必须具有值。
在此示例中,第二行不包括导致错误的主关键字字段。只有标识为 2 的行才能成功加载到表中。
案例 5:模式不合格 - 缺少、不正确或附加字段
输入文件中的问题:
输入文件包含缺少的字段、未正确命名的字段或者不符合表方案的附加字段。
{"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 值。
在此示例中,标识为 7 的行中的字段名称拼写错误,标识为 8 的行中缺少字段 name。在这两种情况下,所有行都会成功加载到表中。name 字段将更新为 null 值。
如果上载因任何原因在中间停止,您可以执行以下操作之一:
-
如果没有包含生成的键值的列(即,如果键完全由 JSON 文件决定),则只需从同一个文件开始即可。已写入的行将再次写入。
-
如果生成了关键字值,则重新开始将写入新记录,而不是覆盖现有记录。最简单的路径是删除表并重新创建表。
-
或者,也可以通过在浏览数据表单中执行语句
DELETE FROM tablename从表中删除所有记录。
如果在上载过程中超出了预配的写入限制,则会显示一条指示该限制的临时消息,并且会减慢上载速度以避免再次超出限制。