【问题标题】:Increase column's size in Oracle DB tables with Knex.js使用 Knex.js 增加 Oracle DB 表中的列大小
【发布时间】:2020-03-10 07:51:58
【问题描述】:

我在一个表中有一个密码列,存储在 OracleDB 11g 中。

为了在上面存储散列密码,我需要将其大小从 25 增加到 60 或 100 BYTE。

我不想手动执行此操作,我希望我能找到使用 KnexJS 的脚本或其他任何东西(例如迁移或种子)

谢谢。

【问题讨论】:

  • 我不知道。但是,你为什么不干脆alter table your_table modify password_column varchar2(100 byte)
  • 我不知道,我想用这个 knex.schema.raw('alter table MYTABLE modify MYCOLUMN varchar2(100)')。它会起作用吗?
  • 不知道,对不起,因为我不知道 node.js 和“knex.schema.raw”是我以前从未见过的东西。但是,就 Oracle 本身而言,这样的命令会起作用。
  • 你为什么“想要使用这个 knex.schema.raw”?正如@Littlefoot 所建议的那样,您为什么如此热衷于使用某些框架来发出简单、单一、一次性的 SQL 语句的想法
  • 我在一个使用 Node.js、Knex.js 和 Oracle Db 的项目中工作,所以基本上我想创建一个迁移文件,以便在运行应用程序后将 ser 大小设置为 255。不知道有没有别的想法。

标签: node.js oracle size knex.js


【解决方案1】:

您想要做的正确术语是“增加”,而不是“增加”。看起来 Knex.js 支持通过 alter 方法更改列(要创建)的默认 DDL 以更改。 http://knexjs.org/#Schema-alter

理论上,它应该是这样工作的:

knex.schema.alterTable('user', function(t) {
  t.string('password', 100).alter();
});

我必须承认,这种方法中的以下措辞让我有点担心:

Alter 不会在旧的列类型上逐步完成,因此如果您想添加 notNull 并保留旧的默认值,alter 语句必须同时包含 .notNull().defaultTo(1).alter()。

我不确定这到底意味着什么。请务必在生产中尝试之前在开发中进行测试!

【讨论】:

  • 这意味着,如果您创建了没有默认 t.string(...).notNull() 的不可空列,那么执行 t.string(...)..defaultTo('foo').alter() 会将其更改为可空的,默认值为 'foo'。所以改变不能增量工作,但它会覆盖整个旧列声明(我不确定这个解释是否比文档中的解释更清楚)。
  • 不太清楚。在 Oracle 数据库中,如果我使用create table t (c varchar2(30) not null) 创建一个表,然后使用alter table t modify c varchar2(100) 更改该列,则不会丢失非空约束。那么 Knex.js 做了什么导致它丢失呢?
  • 使用 postgresql 它首先删除所有约束/默认值,然后更改列类型,最后添加新声明的约束和默认值。对于mysql,它还使用alter table modify ...,据我所知,它也完成了列的重新声明,因此旧的not nulldefault value 被隐式删除。然而,实际上可能与 oracle 不同,它的工作方式有所不同,并且 knex 中存在一个错误,正确生成的更改将类似于 alter table t modify c varchar2(100) null default NULL 以删除 null 并“删除”默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多