我ALTER TABLE
对一个非常大的表(大约3000万行)上的命令有疑问.其中一个列是a varchar(255)
,我想将其调整为a varchar(40)
.基本上,我想通过运行以下命令来更改我的列:
ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);
Run Code Online (Sandbox Code Playgroud)
如果进程很长,我没有问题,但似乎我的表在ALTER TABLE命令期间不再可读.有更聪明的方法吗?也许添加一个新列,从旧列复制值,删除旧列,最后重命名新列?
任何线索将不胜感激!提前致谢,
注意:我使用PostgreSQL 9.0.
这是我的模特:
class Position(models.Model):
map = models.ForeignKey(Map,primary_key=True)
#members=models.CharField(max_length=200)
LatLng = models.CharField(max_length=40000)
infowindow = models.CharField(max_length=40000)
Run Code Online (Sandbox Code Playgroud)
但它无法运行..
谢谢
是否可以定义在CAST
操作失败时返回的默认值?
例如,这样:
SELECT CAST('foo' AS INTEGER)
Run Code Online (Sandbox Code Playgroud)
将返回默认值而不是抛出错误?
sqlite使用作者称之为" Manifest Typing "的东西,这基本上意味着sqlite是动态类型的:如果你愿意,你可以在一个"int"列中存储一个varchar值.
这是一个有趣的设计决定,但每当我使用sqlite时,我就像标准的RDMS一样使用它,并将类型视为静态.实际上,在其他系统中设计数据库时,我甚至从未希望使用动态类型列.
那么,这个功能何时有用?有没有人在实践中找到了一个很好用的东西,用静态类型的列不能轻易完成?
ERROR 22001(string_data_right_truncation):类型字符变化的值太长(255)
我理解(并假设)字符串将限制为一定数量的字符; 但是,我不确定哪种类型最适合这种情况.
我应该使用什么类型的凤凰框架博客的"内容"部分?
数据将是文本段落,不能限制大小.
提前致谢.
我有一个长度范围很大的字符串序列:从30到282420个字符。我想使用jdbc将每个字符串存储到postgres数据库中。
String query = "INSERT INTO " + tableName +
" (cbsID, ownerID, naam, soortRegio, jaar, centroidLat, centroidLon, borders) " +
" VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement ps = connection.prepareStatement(query);
for (Marker marker: gemeenteMarkers)
{
Area gemeente = (Area) marker.getProperty("area");
String sloc = "";
// ... do some computations
// Compute sloc, a string that may contain over 250.000 characters
ps.setInt (1, gemeente.getAreaId ());
ps.setInt (2, gemeente.getParentId ());
ps.setString (3, gemeente.getAreaName ());
ps.setString (4, "GM"); …
Run Code Online (Sandbox Code Playgroud) 在我的Web应用程序中,我有一个文本区域,其用户填充的内容最终通过Hibernate持久保存到db.我遇到了一个问题,当用户输入超过一定长度时,持久性就会失败.有没有办法通过Hibernate Annotations或在配置中指出这个特定字段应该支持更长的字符串,并且数据库列类型应该反映这一点?
这是我得到的例外情况:
Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'introText' at row 1
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 41 more
Run Code Online (Sandbox Code Playgroud) 我正在 PostgreSQL 上创建一个表,我知道该文件是 char 数据类型,但尽管我知道它最多可以存储 100 个字符,但我想知道下一个:
字符或字符变化而不是文本的优点是什么?
我认为我知道的
如果我没记错字符是固定长度保留在内存中,而varchar是可变的,与Text数据类型相同。最后一个能够存储 1 GB 的数据,但最小为 0 kb,与 varchar 和 char 的最小值相同。
假设案例
然后,猜猜我很懒,尽管我知道最多我将存储 100 个字符,但我使用文本,因为如果将来需要,它可以存储这 100 个字符甚至更多。我在这里失去了哪些特征而不使用适当的数据类型?
有没有办法使用哈希方法创建主键?以下两个陈述都不起作用:
oid char(30) primary key using hash
primary key(oid) using hash
Run Code Online (Sandbox Code Playgroud) 在 Debian Jessie 64 上使用 PostgreSQL 9.4.3。
问题.sql:
\set client_min_messages = debug
BEGIN;
SELECT * from no_plan();
SELECT Dugong.Users_Add('Sarit','thisispassword','programmer');
SELECT is(Dugong.Users_isExist('Sarit'),'t', 'Test Question_isExist() should return true' );
PREPARE A AS SELECT Username, Password, Privilege FROM Dugong.Users;
SELECT results_eq('A',$$VALUES ('sarit','thisispassword','programmer') $$,'Test wtf');
SELECT results_eq('A',$$VALUES ('Sarit','thisispassword','programmer') $$,'Test wtf');
SELECT * FROM finish();
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)
输出:
postgres@jaikra:/home/sarit/4alls/anemonesfish/pgtap$ pg_prove -v -d skorplusdb question.sql
question.sql ..
Sarit
ok 1 - Test Question_isExist() should return true
not ok 2 - Test wtf
# Failed test 2: "Test …
Run Code Online (Sandbox Code Playgroud) postgresql ×6
sql ×2
alter-table ×1
annotations ×1
django ×1
ecto ×1
elixir ×1
hash ×1
hibernate ×1
jdbc ×1
pgtap ×1
sqldatatypes ×1
sqlite ×1
varchar ×1