# Sequelize Default Values

1. **<mark>Introduction</mark>**  
    In Sequelize, a popular Node.js ORM (Object-Relational Mapping) for relational databases, default values are used to specify a value that will be automatically set for a column if no explicit value is provided when a record is created. Default values are useful for ensuring that certain fields always have a valid value, even if the user or application doesn’t supply one.  
    By setting default values appropriately, you can make your database schema more robust and simplify your application's data-handling logic.
    
2. **<mark>Setting Default Values</mark>**  
    You can set default values for fields in your Sequelize models when you define the model. Here’s how you can do it,
    
    ```javascript
    const { Sequelize, DataTypes } = require('sequelize');
    const sequelize = new Sequelize('sqlite::memory:'); // Example using SQLite
    
    const User = sequelize.define('User', {
      username: {
        type: DataTypes.STRING,
        allowNull: false
      },
      age: {
        type: DataTypes.INTEGER,
        defaultValue: 21  // Default value of 21 for age
      },
      isActive: {
        type: DataTypes.BOOLEAN,
        defaultValue: true  // Default value of true for isActive
      },
      createdAt: {
        type: DataTypes.DATE,
        defaultValue: Sequelize.NOW  // Default to the current date and time
      }
    });
    
    sequelize.sync().then(() => {
      return User.create({
        username: 'john_doe'
        // Notice we are not providing values for age, isActive, or createdAt
      });
    }).then(user => {
      console.log(user.toJSON());
    });
    ```
    
    i) **defaultValue**  
    This option is used to specify the default value for a column. If no value is provided for the column when a new record is created, Sequelize will automatically insert this default value.
    
    ii) **Sequelize.NOW**  
    This is a special constant provided by Sequelize that represents the current date and time. It's often used as a default value for `DATE` or `DATEONLY` fields.
    
3. **<mark>Use Cases for Default Values</mark>**
    
    i) **Timestamps**  
    Automatically setting the creation or update timestamp fields.
    
    ii) **Flags or Statuses**  
    Automatically setting boolean flags like `isActive` or `isAdmin`.
    
    iii) **Counters**  
    Setting a default count value, such as a view count starting from zero.
    
    iv) **Fallback values**  
    Providing default values for optional fields to avoid `null` values.
    
4. **<mark>Important Considerations</mark>**
    
    i) **Overriding Defaults**  
    If you provide a value when creating a record, the provided value will override the default.
    
    ii) **Database-Level Defaults**  
    If you want to enforce defaults at the database level (e.g., in the schema itself), this should be defined in your database schema. Sequelize's default values are enforced at the application level.
    
    iii) **Complex Defaults**  
    If you need a more complex default value (e.g., based on a function), you can use a function as the `defaultValue`.
