【问题标题】:How to alter varchar length of a table, which is Composite Primary Key?如何更改表的 varchar 长度,即复合主键?
【发布时间】:2015-03-11 06:27:35
【问题描述】:

现有场景:

1) 字段说明

userid      varchar(12) Primary Key

2) 表包含数百万用户(数据)。

我想在不影响现有数据、约束和结构的情况下将用户 ID 大小更改为 varchar(20)?

如何在 oracle,mssql and mysql 中实现这一点?

【问题讨论】:

  • 当您对增加 varchar 大小的列进行简单更改时,您预见到什么损害/影响?
  • 你为什么不直接改变表格?增加尺寸不会造成任何损坏。为什么不考虑使用整数作为主键而不是文本值
  • 如果我没记错的话,在 MS SQL 上更改列的数据类型需要 DROP 使用它的所有索引。在 PRIMARY KEY 的情况下,它可能很难......
  • 你真的必须在 MySQL、SQL Server 和 Oracle 中这样做吗?就像@Yaman 所说,你真的应该使用整数作为主键,因为这会在很大程度上减少索引并提高性能。就目前而言,您只是拥有一个设计不佳的数据库。与其添加问题,不如修复它或向您的团队提出正确的修复建议,您所有人(包括用户)都将从现在和将来的更改中受益。
  • 对于 Sql Server ALTER TABLE Tablename ALTER COLUMN userid VARCHAR(20) NOT NULL。您需要在alter 中提及 NOT NULL

标签: mysql sql-server oracle


【解决方案1】:

首先永远不要使用 VARCHAR 作为主键。它显着降低了 Oracle 搜索查询的速度。使用 Long 或 int 相同

你可以使用这个语句修改MySql中任意列的大小

ALTER TABLE <table_name> MODIFY <col_name> VARCHAR(20)

它不会改变或改变现有数据

【讨论】:

    【解决方案2】:

    在 Oracle 中,只需发出 ALTER table MODIFY -

    alter table table_name modify (column_name varchar2(20))

    例如,

    SQL> create table t(text varchar2(12), constraint t_pk primary key (text));
    
    Table created.
    
    SQL> insert into t(text) values ('text');
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> alter table t modify(text varchar2(20));
    
    Table altered.
    
    SQL>
    

    【讨论】:

      【解决方案3】:

      varchars 不会为您实际拥有的数据之外的“额外”容量消耗空间。您应该能够只更改表格以调整列大小而不会产生任何不利影响:

      ALTER TABLE mytable MODIFY COLUMN userid VARCHAR(20)
      

      【讨论】:

        【解决方案4】:

        对于 MYSQL:

        ALTER TABLE `mdl_user` CHANGE `userid` `userid` VARCHAR( 20 );
        

        如果您减小列的大小,可能会丢失数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-25
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 2013-09-16
          • 1970-01-01
          相关资源
          最近更新 更多