mysql数据库schema是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库schema是啥相关的知识,希望对你有一定的参考价值。

另外数据库的结构是怎样的,一个实例包含一个数据库吗,还是可以有多个,database包含schema?

schema在数据库中表示的是数据库对象集合,它包含了各种对像,比如:表,视图,存储过程,索引等等。

一般情况下一个用户对应一个集合,为了区分不同的集合就需要给不同的集合起名字。用户的schema名就相当于用户名,并作为该用户缺省schema。

所以说,schema集合看上去像用户名。例如,当访问一个数据表时,如果该表没有指明属于哪个schema,系统就会自动的加上缺省的schema。



扩展资料

Schema的创建在不同的数据库中要创建的Schema方法是不一样的,但是它们有一个共同的特点就是都支持CREATE SCHEMA语句。

mysql数据库中,可以通过CREATE SCHEMA语句来创建一个数据库Oracle Database在Oracle中,由于数据库用户已经创建了一个模式,所以,CREATE SCHEMA语句创建的是一个schema,它允许将schema同表和视图关联起来,并在这些多个事务中发出多个SQL语句。

SQL Server在SQL Server中,CREATE SCHEMA会按照名称来创建一个模式,与MySQL不同,CREATE SCHEMA语句创建了一个单独定义到数据库的模式。和Oracle数据库也有不同,它实际上创建了一个模式,而且一旦创建了模式,就可以往模式中添加用户和对象。

参考技术A

数据库中schema是数据库对象集合,它包含了表,视图等多种对象。schema就像是用户名,当访问数据表时未指明属于哪个schema,系统就会自动的加上缺省的schema。

schema在数据库中表示的是数据库对象集合,它包含了各种对像,比如:表,视图,存储过程,索引等等。一般情况下一个用户对应一个集合,所以为了区分不同的集合就需要给不同的集合起名字。用户的schema名就相当于用户名,并作为该用户缺省schema。

扩展资料

Schema的创建:

需要注意的是,在不同的数据库中要创建的Schema方法是不一样的,但是它们有一个共同的特点就是都支持CREATESCHEMA语句。

在Oracle中,由于数据库用户已经创建了一个模式,所以CREATESCHEMA语句创建的是一个schema,它允许将schema同表和视图关联起来,并在这些对象上真奇葩,原来授权,从而不必在多个事务中发出多个SQL语句。

参考技术B
MySQL 中 Schema 等价于 数据库。

mysql> SELECT
    ->   SCHEMA_NAME,
    ->   DEFAULT_CHARACTER_SET_NAME,
    ->   DEFAULT_COLLATION_NAME
    -> FROM
    ->   INFORMATION_SCHEMA.SCHEMATA;
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| information_schema | utf8                       | utf8_general_ci        |
| mysql              | latin1                     | latin1_swedish_ci      |
| sqldoc             | utf8                       | utf8_general_ci        |
| test               | latin1                     | latin1_swedish_ci      |
| test2              | latin1                     | latin1_swedish_ci      |
+--------------------+----------------------------+------------------------+
5 rows in set (0.00 sec)

参考技术C mysql schemas 概念 和 oracle schemas 不一样。
schemas 的 概念可理解为 "多个表(数据库对象)的集合,某用户拥有操作权限"
所以 schemas 在 mysql 中 理解为 database(逻辑库);
参考技术D 我觉得mysql的schema就类似于Oracle中的表空间

Laravel Schema 中的 MySQL 数据类型 SET 等价物是啥?

【中文标题】Laravel Schema 中的 MySQL 数据类型 SET 等价物是啥?【英文标题】:What is the MySQL datatype SET equivalent in Laravel Schema?Laravel Schema 中的 MySQL 数据类型 SET 等价物是什么? 【发布时间】:2014-08-08 22:20:36 【问题描述】:

Laravel Schema 有一个与表等效的 ENUM 命令。什么是 SET 等价于表?

【问题讨论】:

【参考方案1】:

到目前为止,Laravel Schema Builder 不支持列的 SET 数据类型。因此,在有人将这些代码添加到 Laravel 之前,这是一个替代解决方案。

第 1 步:创建表,使用 ENUM 而不是 SET。

Schema::create('schools', function($table)

    $table->increments('id');
    $table->char('id_number', 6);
    $table->string('school_name');
    $table->enum('level', array('Preschool', 'Kindergarten', 'Primary', 'Secondary'))->index(); // *** fix this
    $table->string('phone');
    $table->string('email');
    $table->string('location');
    $table->smallInteger('city')->unsigned()->index();
    $table->smallInteger('country')->unsigned()->index();
    $table->smallInteger('head_teacher')->unsigned()->index();
    $table->smallInteger('director')->unsigned()->index();
    $table->smallInteger('created_by')->unsigned();
    $table->smallInteger('modified_by')->unsigned();
    $table->timestamps();
);

第 2 步:现在将 ENUM 更改为 SET。

$table_prefix = DB::getTablePrefix();
DB::statement("ALTER TABLE `" . $table_prefix . "schools` CHANGE `level` `level` SET('Preschool','Kindergarten','Primary','Secondary');");

如果您有更好的解决方案,请告诉我。

【讨论】:

为什么不在之后添加表格(使用DB::statement 调用)?为什么要添加它,然后再更改它? @ajon 好问题。我这样做是为了尽量减少DB::statement 的使用。【参考方案2】:

第 1 步。 扩展默认类(将此代码添加到您的迁移文件中 use 部分之后):

class ExtendedBlueprint extends Blueprint 

    /**
     * Create a new set column on the table.
     *
     * @param  string  $column
     * @param  array   $allowed
     * @return \Illuminate\Support\Fluent
     */
    public function set($column, array $allowed)
    
        return $this->addColumn('set', $column, compact('allowed'));
    




class ExtendedMySqlGrammar extends Illuminate\Database\Schema\Grammars\MySqlGrammar 

    /**
     * Create the column definition for an set type.
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeSet(\Illuminate\Support\Fluent $column)
    
        return "set('".implode("', '", $column->allowed)."')";
    


第 2 步。 然后,我们需要将默认语法和蓝图类更改为我们的自定义:

// set new grammar class
DB::connection()->setSchemaGrammar(new ExtendedMySqlGrammar());

// get custom schema object
$schema = DB::connection()->getSchemaBuilder();

// bind new blueprint class
$schema->blueprintResolver(function($table, $callback) 
    return new ExtendedBlueprint($table, $callback);
);

// then create tables 
$schema->create('table name', function(ExtendedBlueprint $table)

    $table->increments('id');
    $table->text('sentence');
    $table->string('author')->nullable();
    $table->string('source')->nullable();
    $table->set('difficulty', range(1, 10)); // use our new mysql type 
    $table->boolean('enabled')->default(true);
);

这个方法在composer update之后也可以使用,因为我们没有编辑任何框架代码。

【讨论】:

执行此操作时出现错误。 Argument 1 passed to CreateTableName::closure() must be an instance of ExtendedBlueprint, instance of Illuminate\Database\Schema\Blueprint given 有什么想法吗?我确实在我的创建回调中将 Blueprint 更改为 ExtendedBlueprint。 我想通了。我使用 Schema::create( ... ) 而不是 $schema->create( ... )【参考方案3】:

Roman Nazarkin 的方法几乎可以完美运行,但是表前缀存在一个小问题(此方法不考虑),但是让这个建议适用于表前缀很简单:

$grammar = DB::connection()->withTablePrefix(new ExtendedMySqlGrammar());
// set new grammar class
DB::connection()->setSchemaGrammar($grammar);

// get custom schema object
$schema = DB::connection()->getSchemaBuilder();

// bind new blueprint class
$schema->blueprintResolver(function($table, $callback) 
    return new ExtendedBlueprint($table, $callback);
);

// then create tables 
$schema->create('table name', function(ExtendedBlueprint $table)

    $table->increments('id');
    $table->text('sentence');
    $table->string('author')->nullable();
    $table->string('source')->nullable();
    $table->set('difficulty', range(1, 10)); // use our new mysql type 
    $table->boolean('enabled')->default(true);
);

【讨论】:

【参考方案4】:

扩展 laravel 数据库模式方法并不难。就像 Roman 写的那样,你也可以更新你的

,而不是扩展

vendor/laravel/framework/src/Illuminate/Database/Schema/Grammers/MysqlGrammer.php

/**
 * Create the column definition for an set type.
 *
 * @param  \Illuminate\Support\Fluent  $column
 * @return string
*/
protected function typeSet(Fluent $column)
    return "set('".implode("', '", $column->allowed)."')";

vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php

/**
     * Create a new set column on the table.
     *
     * @param  string  $column
     * @param  array   $allowed
     * @return \Illuminate\Support\Fluent
    */
    public function set($column, array $allowed)
        return $this->addColumn('set', $column, compact('allowed'));
    

在此之后,按 Ctrl + C 终止您的服务器。然后键入 php artisan serve 启动 laravel。

【讨论】:

【参考方案5】:

当您需要创建自定义列而不创建其他文件来描述扩展语法时,我的简单一次性解决方案。在这里,我将自定义类型 rsvp_statuses 添加到 PostgresGrammar

    public function up()
    
        DB::connection()->setSchemaGrammar(new class extends PostgresGrammar 
            protected function typeRsvp_statuses(\Illuminate\Support\Fluent $column)
            
                return 'rsvp_statuses';
            
        );

        Schema::create('mytable', function (Blueprint $table) 
            $table->bigIncrements('id');
            //...
            $table->addColumn('rsvp_statuses', 'status');
            $table->timestamps();
        );
    

【讨论】:

【参考方案6】:

Laravel 5.8 and onwards 在迁移中支持 SET 数据类型。对于最新版本,您只需使用 set() 函数:

// SET equivalent column named flavors
// Allowed values: strawberry , vanilla
$table->set('flavors', ['strawberry', 'vanilla']);

查看最新文档中的更多详细信息:

https://laravel.com/docs/master/migrations https://laravel.com/api/master/Illuminate/Database/Schema/Blueprint.html#method_set

【讨论】:

以上是关于mysql数据库schema是啥的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中的information_schema.COLUMNS 是啥意思呢

PostgreSQL '模式'的 MySQL 等价物是啥?

mysql数据库 group by 报错 原理是啥?

MYSQL获取一个表所有字段名的最佳办法是啥?

C#连接MySql数据库的连接字符串是啥?

mysql 安装后数据库名是啥 root是用数据库户名 数据库叫啥?