比较MySQL和SQLite创建表语句

时间:2016-06-13 17:15:41

标签: mysql sqlite

所以我想尝试使用"代码优先制作应用程序"方法和主动记录ORM。我愿意在这个应用程序中使用MySQL和SQLite(两者)。以下是我创建数据库的方法:

(这是我为这个问题提出的一个模型表)

    $this->int("id", self::INT_MEDIUM)->unSigned()->primaryKey()->autoIncrement();
    $this->string("hash", 64, self::STR_FIXED)->unique();
    $this->enum("status", "available","sold","pending")->defaultValue("available");
    $this->int("category", self::INT_MEDIUM)->unSigned()->defaultValue(0);
    $this->string("name")->unique();
    $this->text("descr")->nullable();
    $this->decimal("price", 10, 4)->defaultValue(1.234);
    $this->uniqueKey("store_np", "name", "price");
    $this->foreignKey("category", "categories", "id");

然后我的代码为我生成了CREATE TABLE语句,结果如下:

MySQL的:

CREATE TABLE `products` (
  `id` mediumint UNSIGNED PRIMARY KEY auto_increment NOT NULL,
  `hash` char(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `status` enum('available','sold','pending') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL default 'available',
  `category` mediumint UNSIGNED NOT NULL default 0,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `descr` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci default NULL,
  `price` decimal(10,4) NOT NULL default 1.234,
  UNIQUE KEY (`hash`),
  UNIQUE KEY (`name`),
  UNIQUE KEY `store_np` (`name`,`price`),
  FOREIGN KEY (`category`) REFERENCES `categories`(`id`)
) ENGINE=InnoDB;

SQLite的:

CREATE TABLE `products` (
  `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  `hash` TEXT UNIQUE NOT NULL,
  `status` TEXT CHECK(status in ('available','sold','pending') ) NOT NULL default 'available',
  `category` INTEGER UNSIGNED NOT NULL default 0,
  `name` TEXT UNIQUE NOT NULL,
  `descr` TEXT default NULL,
  `price` REAL NOT NULL default 1.234,
  CONSTRAINT `store_np` UNIQUE (`name`,`price`),
  CONSTRAINT `cnstrnt_category_frgn` FOREIGN KEY (`category`) REFERENCES `categories`(`id`)
);

我在phpMyAdmin和phpLiteAdmin中执行了两个查询,两者似乎都运行良好。

以下是我的担忧:

  • 例如,我不知道我不能使用" UNSIGNED"使用" PRIMARY KEY AUTOINCREMENT"在SQLite中,这让我很难理解。还有什么我应该关注的吗?
  • 即使两个声明都成功执行,它们是否会按预期工作?特别是SQLite中的约束
  • 请检查"状态" SQLite中的列,是否适合用作MySQL枚举的替代方法?

0 个答案:

没有答案