使用R的dbWriteTable写入MySQL时指定字段非空及默认值
解决R中dbWriteTable写入MySQL时设置非空约束和默认值的问题
dbWriteTable本身没法通过自带参数直接设置非空约束、默认值这类表结构属性,而且如果用overwrite=TRUE会直接重建表,导致原有结构丢失。可以用以下两种方式解决:
方法一:先手动建表再导入数据
先通过SQL语句创建好带约束的表,再把数据导入进去,这样能完全控制表结构:
# 执行建表SQL,明确字段类型、非空约束和默认值 dbExecute(connection, " CREATE TABLE barcode_details ( id float NOT NULL, order_no varchar(50) NOT NULL DEFAULT 'unknown', -- 根据你的需求添加其他字段,比如: create_time datetime DEFAULT CURRENT_TIMESTAMP ) ") # 导入数据,用append=TRUE避免覆盖已有表结构 dbWriteTable(conn = connection, name = "barcode_details", value = barcode_details_update, append = TRUE, row.names = FALSE) # 去掉行名,避免生成多余的row.names字段
方法二:先写入表再修改结构
如果已经用dbWriteTable创建了表,后续可以通过ALTER TABLE语句补加约束和默认值:
# 先写入表(如果表已存在,overwrite=TRUE会重建表,谨慎使用) dbWriteTable(conn = connection, name = "barcode_details", value = barcode_details_update, field.types = c( id = "float", order_no = "varchar(50)"), row.names = FALSE) # 执行ALTER语句修改字段属性 dbExecute(connection, " ALTER TABLE barcode_details MODIFY COLUMN id float NOT NULL, MODIFY COLUMN order_no varchar(50) NOT NULL DEFAULT 'unknown' ")
注意事项
- 避免使用
overwrite=TRUE,除非你确实要完全重建表,否则会丢失原有表的约束、索引等结构 - 导入数据时记得加
row.names=FALSE,防止R自动添加多余的行名字段到表中
内容的提问来源于stack exchange,提问作者Shryans Baid
相关产品推荐
相关产品推荐

