2011-03-02 49 views
0

我已经在MySQL下表声明:PostgreSQL - 在MySQL中声明的表的等效版本?

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `session_id` varchar(40) COLLATE utf8_bin NOT NULL DEFAULT '0', 
    `ip_address` varchar(16) COLLATE utf8_bin NOT NULL DEFAULT '0', 
    `user_agent` varchar(150) COLLATE utf8_bin NOT NULL, 
    `last_activity` int(10) unsigned NOT NULL DEFAULT '0', 
    `user_data` text COLLATE utf8_bin NOT NULL, 
    PRIMARY KEY (`session_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

什么将是Postgres的表的等价定义,假设我的数据库已在使用UTF-8编码?

回答

3
CREATE TABLE ci_sessions (
    session_id varchar(40) NOT NULL DEFAULT '0', 
    ip_address varchar(16) NOT NULL DEFAULT '0', 
    user_agent varchar(150) NOT NULL, 
    last_activity int4 NOT NULL DEFAULT '0', 
    user_data text NOT NULL, 
    PRIMARY KEY (session_id) 
); 

修饰符IF NOT EXISTS已将IMHO添加到最新的PostgreSQL版本之一。

编辑:由于未命名的马推荐,我将第4个属性从十进制(10)更改为int4。但我更喜欢这里的时间戳(0)。如果您需要微秒精度,请使用不带(0)的时间戳。

+1

嗯...所以'utf8_bin'和'COLLATE'只是无关的,那么? – 2011-03-02 17:22:49

+0

它是为整个集群定义的。对于个别栏目,不能给出特殊的排序规则,至少在8.4中!让我看看新版本的文档。有关整理的更多信息,请参阅此链接:http://www.postgresql.org/docs/8.4/interactive/locale.html – Daniel 2011-03-02 17:26:03

+0

对不起,没有关于此的新闻。似乎排序规则仍然可以为DB设置。但是,您可以对索引使用特殊的排序规则设置,而在指定正确的排序子句时将使用它们。 – Daniel 2011-03-02 17:33:22

1

除了但以理已经表示:

如果您需要在其上可能会更好使用了原生INET数据类型的IP地址查询:
http://www.postgresql.org/docs/current/static/datatype-net-types.html

列名last_activity建议一个时间戳列或类似的东西。我强烈建议为此使用timestamp数据类型。

如果它有所不同,那么integer与MySQL的int(10)比小数更好地匹配。

请注意,MySQL中的int(10)确实是而非定义了值范围,它仅仅是一个提示用于显示目的!

+0

+ 1感谢在int(10)上添加提示,我不知道MySQL是这样工作的。 – Daniel 2011-03-02 17:39:00

+0

@Daniel:您可能想考虑将您的代码示例更改为使用int而不是小数。 – 2011-03-02 17:40:25

+0

done.1234567890 – Daniel 2011-03-02 17:42:47